1.socket函数 int socket(int domain, int type,int protocol); 成功时返回文件描述符,失败时返回-1 domain: AF_INET ipv4通讯协议 AF_INET6 ipv6 AF_UNIX 只能够用于单一的Unix系统进程间通信 type: SOCK_STREAM 流式套接字,唯一对应于TCP SOCK_DGRAM 数据包套接字,唯一对应与UDP SOCK_RAW 原始套接字 protocol: 由于我们指定了type,所以这个地方我们一般只要用0来代替就可以了
2.bind函数 int bind(int sockfd, struct sockaddr *my_addr, int addrlen); 成功调用返回0,出错返回-1 sockfd: 是由socket调用返回的文件描述符. addrlen: 是sockaddr结构的长度. my_addr: 是一个指向sockaddr的指针. 在中有 sockaddr的定义
struct sockaddr{ unisgned short as_family; //2字节 char sa_data[14]; //14字节 };
不过由于系统的兼容性,我们一般不用这个头文件,而使用另外一个结构(struct sockaddr_in) 来代替.在中有sockaddr_in的定义
struct sockaddr_in{ unsigned short sin_family; //2字节 unsigned short int sin_port; //2字节,端口号str uct in_addr sin_addr; //4字节,结构体 unsigned char sin_zero[8];//填充字节,必须清0 }
struct in_addr{ uint32_t s_addr; //4个字节,32位网络字节序的ip地址 }
3.listen函数 int listen(int sockfd,int backlog) 成功返回0;出错-1 sockfg 是bind后的文件描述符. backlog 一般写5 设置请求排队的最大长度.当有多个客户端程序和服务端相连时, 使用这个表示可以介绍的排队长度. listen函数将bind的文件描述符变为监听套接字.返回的情况和bind一样.
4.accept函数 int accept(int sockfd, struct sockaddr *addr,int *addrlen) accept成功时返回最后的服务器端的文件描述符,这个时候服务器端可以向该描述符写信息了. 失败时返回-1 sockfd 经过前面socket创建并通过bind、listen函数的fd addr addrlen 后两个参数是用来给客户端的程序填写的,服务器端只要传递指针就可以了,分别获取ip地址和端口号 .bind,listen和accept是服务器端用的函数,accept调用时,服务器端的程序会一直阻塞到有一个 客户程序发出了连接.
5.connect函数 int connect(int sockfd, struct sockaddr * serv_addr,int addrlen) .成功时返回0,sockfd是同服务端通讯的文件描述符 失败时返回-1. sockfd: socket返回的文件描述符. serv_addr: 储存了服务器端的连接信息.其中sin_add是服务端的地址 addrlen: serv_addr的长度
6.网络发送数据 ssize_t send(int sockfd, const void *buf,size_t len,int flags); sockfd 发送端的套接字文件描述符 buf 存放应用程序要发送的数据的缓冲区 len 实际要发送的数据的字节数 flags 标志 0则与write一样 MSG_DONTWAIT 非阻塞版本 MSG_OOB 用于发射TCP类型的带外数据
7.网络数据接收 ssize_t recv(int sockfd, void *buf,size_t len,int flags); sockfd 接收端的套接字文件描述符 buf 存放应用程序要接收的数据的缓冲区 len 缓冲区buf的长度 flags 标志 0 则与read一样 MSG_DONTWAIT 非阻塞版本 MSG_OOB 用于发射TCP类型的带外数据 MSG_PEEK 不移动缓冲区读
