目录
一、网络字节序转换函数
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 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
集合中所有描述符删除。
- 参数: