3. 编程1. 编程接口:socket --- 套接字1.被当做一个特殊的文件来看 --- 操作时当做文件来看 --- 获得对应fd ---描述符(字)2.socket本身也是要给函数接口 ---通过该函数接口可以使用linux的网络功能编程: 基于传输层协议学习tcp tansmition control protocol //传输控制协议udp (user datagram) //用户数据报协议2. tcp网络编程模型cs client —— serverbs browser —— serverp2p —— peer to peer1. cs编程——客户端1. socket#include sys/types.h#include sys/socket.hint socket(int domain, int type, int protocol);功能:创建通信的一端参数domain 通信范围AF_UNIX ---本地通信AF_INET ---IPV4AF_INET6 --- IPV6type socket的类型SOCK_STREAM //流式套接字SOCK_DGRAM //用户数据报prtocol 表示前面类型对应的具体协议SOCK_STREAM -默认走的协议就是 tcpSOCK_DGRAM -默认走的协议就是 udp填0 表示走默认协议返回值:成功 返回 socket对应的文件描述符失败 返回 -1 errno被设置2. connectint connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);功能发起连接请求参数sockfd 客户端的socket文件描述符addr 代表服务器端的地址信息addrlen addr对应的地址结构体类型的大小2.1 IPV4的地址结构体struct sockaddrstruct sockaddr_in {sa_family_t sin_family; 代表通信范围in_port_t sin_port; 网络字节序格式的端口号struct in_addr sin_addr; ip地址};struct sockaddrstruct in_addr {uint32_t s_addr; uint32_t --unsigned int --- ip地址 --- 网络字节序};网络字节序大小端只要是发到网络中的数据 ---统一成网络字节序(大端模式) --- 接收放--收到后转换位本机的字节序(主机字节序端口号 htons#include arpa/inet.huint16_t htons(uint16_t hostshort);功能:将hostshort主机字节序数值转换位 网络字节序参数:hostshort 要转换的数值返回值成功 转换好的网络字节序eg: htons(50000);ip地址 inet_addr#include sys/socket.h#include netinet/in.h#include arpa/inet.hin_addr_t inet_addr(const char *cp);功能:将cp传来的ipv4格式的地址转换为网络字节序的数值参数:cp 需要的是一个点分十进制格式的ip地址 192.168.1.122返回值:成功 返回转换好的网络字节序数值失败 -12.cs编程——服务端1.socket2.bind 与connect用法一致3. listenint listen (int sockfd, int backlog)功能将sockfd设置为监听套接字参数sockfd socket创建的fdbacklog 队列的大小最大128返回值成功 0失败 -1errno4.acceptint accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);功能获取连接请求建立连接套接字参数sockfd 监听套接字caddr 用来获取对端的地址信息addrlen 值结果参数注意必须自己初始化一个值sizeofaddr注意accpet 是个阻塞操作 ---如果请求连接队列中为空此时accept会阻塞等待ntoachar *inet_ntoa(struct in_addr in);功能: 将网络字节序 转换为 字符串形式ip地址参数:in 要传保存了ip地址的 struct in_addr 变量返回值:成功 返回值 对应ip地址的字符串失败 NULL网络专有读写ssize_t read (int fdvoid *buf,size_t count);ssize_t recv(int sockfd, const void *buf, size_t lenint flags);ssize_t write(int fdconst void|*buf, size_t count);ssize_t send (int sockfd, const void *buf, size_t lenint flags);功能从指定的sockfd套接字中以flags方式获取长度为len字节的数据到指定的buff内存中。参数sockfd如果服务器则是accept的返回值的新fd如果客户端则是socket的返回值旧fdbuff 用来存储数据的本地内存一般是数组或者动态内存。len 要获取的数据长度flags 获取数据的方式0表示阻塞接受。返回值成功 表示接受的数据长度一般小于等于len