网络编程核心函数
目录
一、网络字节序转换函数
二、服务器端函数
三、客户端函数
四、通用文件操作函数
五、UDP 相关函数
六、文件属性调整函数
七、IO 多路复用相关函数
一、网络字节序转换函数
uint32_t htonl(uint32_t hostlong):- 参数:
hostlong是一个 32 位的主机字节序整数。 - 功能:将 32 位整数从主机字节序转换为网络字节序。
- 返回值:转换后的网络字节序的 32 位整数。
- 参数:
uint16_t htons(uint16_t hostshort):- 参数:
hostshort是一个 16 位的主机字节序整数。 - 功能:将 16 位整数从主机字节序转换为网络字节序。
- 返回值:转换后的网络字节序的 16 位整数。
- 参数:
uint32_t ntohl(uint32_t netlong):- 参数:
netlong是一个 32 位的网络字节序整数。 - 功能:将 32 位整数从网络字节序转换为主机字节序。
- 返回值:转换后的主机字节序的 32 位整数。
- 参数:
uint16_t ntohs(uint16_t netshort):- 参数:
netshort是一个 16 位的网络字节序整数。 - 功能:将 16 位整数从网络字节序转换为主机字节序。
- 返回值:转换后的主机字节序的 16 位整数。
- 参数:
in_addr_t inet_addr(const char *cp):- 参数:
cp是一个指向表示 IP 地址的字符串的指针。 - 功能:将点分十进制的 IP 地址字符串转换为网络字节序的 IP 地址整数。
- 返回值:转换后的网络字节序的 IP 地址整数。
- 参数:
char *inet_ntoa(struct in_addr in):- 参数:
in是一个in_addr结构体,包含网络字节序的 IP 地址。 - 功能:将网络字节序的 IP 地址转换为点分十进制的 IP 地址字符串。
- 返回值:指向转换后的 IP 地址字符串的指针。
- 参数:
二、服务器端函数
int socket(int domain, int type, int protocol):- 参数:
domain表示地址族,常见的值有PF_INET(互联网程序)和PF_UNIX(单机程序)。type表示套接字类型,如SOCK_STREAM(流式套接字,对应 TCP)、SOCK_DGRAM(用户数据报套接字,对应 UDP)、SOCK_RAW(原始套接字)。protocol表示协议,通常为 0 表示自动适应应用层协议。
- 功能:向内核提出创建一个基于内存的套接字描述符。
- 返回值:成功返回申请的套接字 id,失败返回 -1。
- 参数:
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen):- 参数:
sockfd是之前通过socket函数创建的文件描述符,即套接字 id。my_addr是物理接口的结构体指针,表示该接口的信息,可以是通用地址结构struct sockaddr或网络地址结构struct _sockaddr_in。addrlen是参数my_addr的长度。
- 功能:如果在服务器端调用,表示将
sockfd相关的文件描述符与指定的接口地址关联,用于从该接口接受数据;如果在客户端调用,表示要将数据从sockfd所在的描述符中取出并从指定的接口设备上发送出去。 - 返回值:成功返回 0,失败返回 -1。
- 参数:
int listen(int sockfd, int backlog):- 参数:
sockfd是套接字 id。backlog表示允许链接的个数。
- 功能:在
sockfd所在的套接字上监听等待链接。 - 返回值:成功返回 0,失败返回 -1。
- 参数:
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen):- 参数:
sockfd是套接字 id。addr如果为NULL,表示不论客户端是谁都接入;如果要获取客户端信息,则事先定义变量并传入变量地址,函数执行完毕将会将客户端信息存储到该变量中。addrlen如果参数addr为NULL,则该值也为NULL;如果参数addr不是NULL,则应该写成len = sizeof(struct sockaddr)。
- 功能:从已经监听到的队列中取出有效的客户端链接并接入到当前程序。
- 返回值:成功返回一个用于通信的新套接字 id;从该代码之后所有通信都基于该 id,失败返回 -1。
- 参数:
ssize_t recv(int sockfd, void *buf, size_t len, int flags):- 参数:
sockfd如果是服务器则是accept的返回值的新 fd,如果是客户端则是socket的返回值旧 fd。buf是用来存储数据的本地内存,一般是数组或者动态内存。len是要获取的数据长度。flags是获取数据的方式,0 表示阻塞接受。
- 功能:从指定的
sockfd套接字中以flags方式获取长度为len字节的数据到指定的buf内存中。 - 返回值:成功表示接受的数据长度,一般小于等于
len,失败返回 -1。
- 参数:
close():- 功能:关闭指定的套接字 id。
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
sockfd:套接字描述符,指定要操作的套接字。level:选项级别,可以是SOL_SOCKET(套接字级别选项)等。optname:具体的选项名称,如SO_REUSEADDR(允许地址重用)、SO_RCVTIMEO(设置接收超时时间)等。optval:指向包含选项值的缓冲区的指针。optlen:选项值的长度。主要作用
配置套接字行为:
- 通过设置不同的选项,可以改变套接字的各种行为特性。例如,设置
SO_REUSEADDR和SO_REUSEPORT可以允许在短时间内重新使用相同的地址和端口,这在服务器快速重启或多个进程需要共享端口时非常有用。- 设置接收和发送超时时间(如
SO_RCVTIMEO和SO_SNDTIMEO)可以防止程序在等待网络操作时无限期阻塞,提高程序的响应性和可靠性。优化网络性能:
- 可以调整一些参数来优化网络性能。例如,设置缓冲区大小选项(如
SO_RCVBUF和SO_SNDBUF)可以控制接收和发送缓冲区的大小,从而影响数据传输的效率。处理特殊网络需求:
- 根据特定的网络环境和需求,设置一些特殊的选项。比如,在某些情况下可能需要设置 IP 选项(如
IP_OPTIONS)来定制 IP 数据包的头部。返回值和错误处理
该函数返回值为 0 表示成功设置选项,返回 -1 表示发生错误。在发生错误时,可以通过
errno变量获取具体的错误码,常见的错误包括无效的套接字描述符、不支持的选项级别或选项名称、参数错误等。
三、客户端函数
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen):- 参数:
sockfd是本地socket创建的套接子 id。addr是远程目标主机的地址信息。addrlen是参数addr的长度。
- 功能:该函数固定由客户端使用,表示从当前主机向目标主机发起链接请求。
- 返回值:成功返回 0,失败返回 -1。
- 参数:
int send(int sockfd, const void *msg, size_t len, int flags):- 参数:
sockfd如果是服务器则是accept的返回值新 fd,如果是客户端则是sockfd的返回值旧 fd。msg是要发送的消息。len是要发送的消息长度。flags是消息的发送方式。
- 功能:从
msg所在的内存中获取长度为len的数据以flags方式写入到sockfd对应的套接字中。 - 返回值:成功返回发送的字符长度,失败返回 -1。
- 参数:
四、通用文件操作函数
read()/write():read()参数:int fd:文件描述符。void *buf:存储读取数据的缓冲区。size_t count:要读取的字节数。
write()参数:int fd:文件描述符。const void *buf:要写入的数据缓冲区。size_t count:要写入的字节数。
- 功能:可用于操作套接字,进行文件读写操作。
五、UDP 相关函数
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen):- 参数:
sockfd是本地的套接字 id。buf是本地的数据存储,一般是要发送的数据。len是要发送的数据长度。flags是要发送数据方式,0 表示阻塞发送。dest_addr是必选,表示要发送到的目标主机信息结构体。addrlen是目标地址长度。
- 功能:用于 UDP 协议中向对方发送数据。
- 返回值:成功返回发送的数据长度,失败返回 -1。
- 参数:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen):- 参数:
sockfd是本地的套接字 id。buf是要存储数据的内存区,一般是数组或者动态内存。len是要获取的数据长度,一般是buf的大小。flags是获取方式,0 阻塞。src_addr可选,表示对方的地址信息结构体,如果为NULL,表示不关心对方地址。addrlen对方地址信息结构体大小,如果对方地址是NULL,则该值也为NULL。
- 功能:用于 UDP 协议中获取对方发送的数据。
- 返回值:成功接收到的数据长度,失败返回 -1。
- 参数:
六、文件属性调整函数
int fcntl(int fd, int cmd,... /* arg */):- 参数:
fd是要调整的文件描述符。cmd是要调整的文件属性宏名称。...是可变长的属性值参数。
- 功能:修改指定文件的属性信息。
- 返回值:成功时不一定,看
cmd;失败返回 -1。
- 参数:
七、IO 多路复用相关函数
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout):- 参数:
nfds是描述符的上限值,一般是链接后描述符的最大值 + 1。readfds是只读描述符集。writefds是只写描述符集。exceptfds是异常描述符集。以上三个参数都是fd_set *的描述符集合类型。timeout是检测超时时间,如果是NULL表示一直检测不超时。
- 功能:完成指定描述符集合中有效描述符的动态检测。该函数具有阻塞等待功能,在函数执行完毕后,目标测试集合中将只保留最后有数据的描述符。
- 返回值:超时返回 0,失败返回 -1,成功返回大于 0 的值,表示监听到的事件数。
- 参数:
void FD_CLR(int fd, fd_set *set):- 参数:
fd是要删除的描述符编号。set是描述符集合。
- 功能:将指定的
set集合中编号为fd的描述符号删除。
- 参数:
int FD_ISSET(int fd, fd_set *set):- 参数:
fd是要判断的描述符编号。set是描述符集合。
- 功能:判断值为
fd的描述符是否在set集合中,如果在则返回真,否则返回假。
- 参数:
void FD_SET(int fd, fd_set *set):- 参数:
fd是要添加的描述符编号。set是描述符集合。
- 功能:将指定的
fd描述符,添加到set集合中。
- 参数:
void FD_ZERO(fd_set *set):- 参数:
set是描述符集合。
- 功能:将指定的
set集合中所有描述符删除。
- 参数:
