创建socket
函数原型:
int socket(int domain, int type, int protocol);
函数功能
创建一个可读、可写、可控制、可关闭的文件描述符,调用成功返回socket,失败返回-1。
参数解释:
- domain : 使用哪个底层协议族
- type : 指定服务类型
- protocol : 设置为0,表示默认协议
命名socket
函数原型
int bind(int sockfd, const struct sockaddr* my_addr, socklen_t addrlen);
函数功能
将my_addr所指的socket地址分配给未命名的sockfd,成功返回0,失败返回-1并设置errno(EACCES或EADDRINUSE)。
参数解释
- my_addr:TCP/IP协议族又sockaddr_in和sockaddr_in6两个专用socket地址结构体,其中保存地址族,端口号等信息,在传参时转换为sockaddr类型。
监听socket
函数原型
int listen(int sockfd, int backlog);
函数功能
创建一个监听队列以存放待处理的客户连接,成功返回0,失败返回-1并设置errno。
参数解释
- sockfd: 指定被监听的socket
- backlog:提示内核监听队列的最大长度,典型值为5,监听队列如果超过backlog,服务器不受理新的客户连接。
接受连接
函数原型
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
函数功能
从listen监听队列中接受一个链接,成功返回一个新的socket,该socket唯一标识了被接受的这个连接
参数解释
- addr:用来获取被接受连接的远端socket地址。
发起连接
函数原型
int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen);
函数功能
客户端通过这个函数主动与服务器建立连接(服务器通过listen调用来被动接受连接)成功返回0,一旦成功,sockfd唯一标识这个连接。客户通过读写这个sockfd来通信。失败返回-1并置errno(ECONNREFUSED和ETIMEDOUT)。
参数解释
- sockfd:由socket系统调用返回一个socket。
- serv_addr:服务器监听的socket地址。
- addrlen:指定这个地址的长度。
TCP读写
函数原型
TCP
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
UDP
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr,socklen_t addrlen);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
函数功能
socket数据读写
UDP与TCP不同在于每次发送都要通过最后两个参数获取发送端的socket地址,因为UDP没有连接的概念。recvfrom和sendto也可用于面向连接,只需将后两个参数置NULL。
函数参数
- buf:指定缓冲区位置
- len:指定缓冲区大小
- flags :MSG_OOB:发送或接受紧急数据(带外数据)。
socket选项
函数原型
int getsockopt(int sockfd, int level, int option_name, void *option_value, socklen_t * restrict option_len);
int setsockopt(int sockfd, int level, int option_name, const void* option_value, socklen_t option_len);
函数功能
用来读取和设置socket文件描述符属性的方法。
option_name参数说明
- SO_REUSEADDR 强制使用被处于TIME_WAIT状态的连接占用的socket地址。
- SO_RCVBUF和SO_SNDBUF:TCP接收缓冲区和发送缓冲区的大小。
获取IP地址函数
函数原型
int getaddrinfo(const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result);
int getnameinfo(const struct sockaddr *sockaddr, socklen_t addrlen, char *host, socklen_t hostlen, char *serv, socklen_t servlen, int flags);
函数功能
通过主机名获得IP地址,通过服务名获得端口号
通过socket地址获取以字符串表示的主机名和服务名
参数解释
- hostname:可以接受主机名或字符串表示的IP地址
- service:接受服务名或者字符串表示的十进制端口号
- hints:设置NULL,表示允许函数反馈任何有用的结果
- result:指向一个存储函数反馈结果的链表
- host:存放返回的主机名
- serv:存放返回的服务名