目录
一、网络字节序转换函数
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 多路复用相关函数
select
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
中被设置(即是否处于被监视的状态且有相应的事件发生)。如果fd
在集合中并且对应的事件发生了,函数返回非零值;否则返回零。
- 参数:
void FD_SET(int fd, fd_set *set)
:- 参数:
fd
是要添加的描述符编号。set
是描述符集合。
- 功能:将指定的
fd
描述符,添加到set
集合中。
- 参数:
void FD_ZERO(fd_set *set)
:- 参数:
set
是描述符集合。
- 功能:将指定的
set
集合中所有描述符删除。
- 参数:
epoll
-
int epoll_create(int size)
:- 功能:创建一个
epoll
实例。这个实例用于后续的epoll_ctl
和epoll_wait
调用,以监视一组文件描述符的事件。 - 参数:
size
:这个参数曾经用于提示内核内部数据结构的初始大小,但现在这个参数已经被忽略,只是为了保持向后兼容性。
- 返回值:成功时返回一个文件描述符,代表新创建的
epoll
实例;失败时返回 -1,并设置errno
。
- 功能:创建一个
-
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
:- 功能:用于控制
epoll
实例,添加、修改或删除要监视的文件描述符及其相关的事件。 - 参数:
epfd
:由epoll_create
返回的epoll
实例的文件描述符。op
:操作类型,可以是EPOLL_CTL_ADD
(添加文件描述符到监视列表)、EPOLL_CTL_MOD
(修改已监视文件描述符的事件)、EPOLL_CTL_DEL
(从监视列表中删除文件描述符)。fd
:要操作的文件描述符。event
:一个指向struct epoll_event
结构体的指针,该结构体指定了要监视的事件类型以及与文件描述符相关的用户数据。
- 返回值:成功时返回 0;失败时返回 -1,并设置
errno
。
- 功能:用于控制
-
int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)
:- 功能:等待
epoll
实例上的事件发生。它会阻塞调用进程,直到有事件发生或者超时。 - 参数:
epfd
:epoll
实例的文件描述符。events
:一个指向struct epoll_event
结构体数组的指针,用于存储发生的事件。maxevents
:这个数组的大小,即最多可以返回的事件数量。timeout
:超时时间,以毫秒为单位。如果设置为 -1,epoll_wait
将一直阻塞直到有事件发生;如果设置为 0,立即返回,即使没有事件发生;如果设置为正数,等待指定的时间后返回。
- 返回值:成功时返回发生事件的数量;如果超时且没有事件发生,返回 0;失败时返回 -1,并设置
errno
。
- 功能:等待