网络编程核心函数

目录

一、网络字节序转换函数

二、服务器端函数

三、客户端函数

四、通用文件操作函数

五、UDP 相关函数

六、文件属性调整函数

七、IO 多路复用相关函数


一、网络字节序转换函数

  1. uint32_t htonl(uint32_t hostlong)
    • 参数:hostlong是一个 32 位的主机字节序整数。
    • 功能:将 32 位整数从主机字节序转换为网络字节序。
    • 返回值:转换后的网络字节序的 32 位整数。
  2. uint16_t htons(uint16_t hostshort)
    • 参数:hostshort是一个 16 位的主机字节序整数。
    • 功能:将 16 位整数从主机字节序转换为网络字节序。
    • 返回值:转换后的网络字节序的 16 位整数。
  3. uint32_t ntohl(uint32_t netlong)
    • 参数:netlong是一个 32 位的网络字节序整数。
    • 功能:将 32 位整数从网络字节序转换为主机字节序。
    • 返回值:转换后的主机字节序的 32 位整数。
  4. uint16_t ntohs(uint16_t netshort)
    • 参数:netshort是一个 16 位的网络字节序整数。
    • 功能:将 16 位整数从网络字节序转换为主机字节序。
    • 返回值:转换后的主机字节序的 16 位整数。
  5. in_addr_t inet_addr(const char *cp)
    • 参数:cp是一个指向表示 IP 地址的字符串的指针。
    • 功能:将点分十进制的 IP 地址字符串转换为网络字节序的 IP 地址整数。
    • 返回值:转换后的网络字节序的 IP 地址整数。
  6. char *inet_ntoa(struct in_addr in)
    • 参数:in是一个in_addr结构体,包含网络字节序的 IP 地址。
    • 功能:将网络字节序的 IP 地址转换为点分十进制的 IP 地址字符串。
    • 返回值:指向转换后的 IP 地址字符串的指针。

二、服务器端函数

  1. 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。
  2. 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。
  3. int listen(int sockfd, int backlog)
    • 参数:
      • sockfd是套接字 id。
      • backlog表示允许链接的个数。
    • 功能:在sockfd所在的套接字上监听等待链接。
    • 返回值:成功返回 0,失败返回 -1。
  4. int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
    • 参数:
      • sockfd是套接字 id。
      • addr如果为NULL,表示不论客户端是谁都接入;如果要获取客户端信息,则事先定义变量并传入变量地址,函数执行完毕将会将客户端信息存储到该变量中。
      • addrlen如果参数addrNULL,则该值也为NULL;如果参数addr不是NULL,则应该写成len = sizeof(struct sockaddr)
    • 功能:从已经监听到的队列中取出有效的客户端链接并接入到当前程序。
    • 返回值:成功返回一个用于通信的新套接字 id;从该代码之后所有通信都基于该 id,失败返回 -1。
  5. 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。
  6. 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:选项值的长度。

主要作用

  1. 配置套接字行为:

    • 通过设置不同的选项,可以改变套接字的各种行为特性。例如,设置 SO_REUSEADDR 和 SO_REUSEPORT 可以允许在短时间内重新使用相同的地址和端口,这在服务器快速重启或多个进程需要共享端口时非常有用。
    • 设置接收和发送超时时间(如 SO_RCVTIMEO 和 SO_SNDTIMEO)可以防止程序在等待网络操作时无限期阻塞,提高程序的响应性和可靠性。
  2. 优化网络性能:

    • 可以调整一些参数来优化网络性能。例如,设置缓冲区大小选项(如 SO_RCVBUF 和 SO_SNDBUF)可以控制接收和发送缓冲区的大小,从而影响数据传输的效率。
  3. 处理特殊网络需求:

    • 根据特定的网络环境和需求,设置一些特殊的选项。比如,在某些情况下可能需要设置 IP 选项(如 IP_OPTIONS)来定制 IP 数据包的头部。

返回值和错误处理

 

该函数返回值为 0 表示成功设置选项,返回 -1 表示发生错误。在发生错误时,可以通过 errno 变量获取具体的错误码,常见的错误包括无效的套接字描述符、不支持的选项级别或选项名称、参数错误等。

三、客户端函数

  1. int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
    • 参数:
      • sockfd是本地socket创建的套接子 id。
      • addr是远程目标主机的地址信息。
      • addrlen是参数addr的长度。
    • 功能:该函数固定由客户端使用,表示从当前主机向目标主机发起链接请求。
    • 返回值:成功返回 0,失败返回 -1。
  2. 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。

四、通用文件操作函数

  1. read()/write()
    • read()参数:
      • int fd:文件描述符。
      • void *buf:存储读取数据的缓冲区。
      • size_t count:要读取的字节数。
    • write()参数:
      • int fd:文件描述符。
      • const void *buf:要写入的数据缓冲区。
      • size_t count:要写入的字节数。
    • 功能:可用于操作套接字,进行文件读写操作。

五、UDP 相关函数

  1. 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。
  2. 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。

六、文件属性调整函数

  1. int fcntl(int fd, int cmd,... /* arg */)
    • 参数:
      • fd是要调整的文件描述符。
      • cmd是要调整的文件属性宏名称。
      • ...是可变长的属性值参数。
    • 功能:修改指定文件的属性信息。
    • 返回值:成功时不一定,看cmd;失败返回 -1。

七、IO 多路复用相关函数

select

  1. 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 的值,表示监听到的事件数。
  2. void FD_CLR(int fd, fd_set *set)
    • 参数:
      • fd是要删除的描述符编号。
      • set是描述符集合。
    • 功能:将指定的set集合中编号为fd的描述符号删除。
  3. int FD_ISSET(int fd, fd_set *set)
    • 参数:
      • fd是要判断的描述符编号。
      • set是描述符集合。
    • 功能:用于检查给定的文件描述符fd是否在文件描述符集set中被设置(即是否处于被监视的状态且有相应的事件发生)。如果fd在集合中并且对应的事件发生了,函数返回非零值;否则返回零。
  4. void FD_SET(int fd, fd_set *set)
    • 参数:
      • fd是要添加的描述符编号。
      • set是描述符集合。
    • 功能:将指定的fd描述符,添加到set集合中。
  5. void FD_ZERO(fd_set *set)
    • 参数:
      • set是描述符集合。
    • 功能:将指定的set集合中所有描述符删除。

epoll

  1. int epoll_create(int size)

    • 功能:创建一个 epoll 实例。这个实例用于后续的 epoll_ctl 和 epoll_wait 调用,以监视一组文件描述符的事件。
    • 参数
      • size:这个参数曾经用于提示内核内部数据结构的初始大小,但现在这个参数已经被忽略,只是为了保持向后兼容性。
    • 返回值:成功时返回一个文件描述符,代表新创建的 epoll 实例;失败时返回 -1,并设置 errno
  2. 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
  3. int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout)

    • 功能:等待 epoll 实例上的事件发生。它会阻塞调用进程,直到有事件发生或者超时。
    • 参数
      • epfdepoll 实例的文件描述符。
      • events:一个指向 struct epoll_event 结构体数组的指针,用于存储发生的事件。
      • maxevents:这个数组的大小,即最多可以返回的事件数量。
      • timeout:超时时间,以毫秒为单位。如果设置为 -1,epoll_wait 将一直阻塞直到有事件发生;如果设置为 0,立即返回,即使没有事件发生;如果设置为正数,等待指定的时间后返回。
    • 返回值:成功时返回发生事件的数量;如果超时且没有事件发生,返回 0;失败时返回 -1,并设置 errno

 

你可能感兴趣的:(网络)