Skip to content

1. 网络字节序与主机字节序的转换函数

这些函数可通过man 函数名查看

       #include <arpa/inet.h>

       uint32_t htonl(uint32_t hostlong);

       uint16_t htons(uint16_t hostshort);

       uint32_t ntohl(uint32_t netlong);

       uint16_t ntohs(uint16_t netshort);

h表示主机,n表示网络;l表示long,即ip地址;s表示short,端口号。

1.1 一步到位:

       #include <arpa/inet.h>

       //把点分十进制字符串形式的ip地址转换为字节序格式:
       int inet_pton(int af, const char *src, void *dst);
       //这个函数则相反:
       const char *inet_ntop(int af, const void *src,
                             char *dst, socklen_t size);

参数说明:

  • af: AF_INET(ipv4)、AF_INET6(ipv6)
  • src: 源地址
  • dst: 转换后的字节序

2. sockaddr数据结构

sockaddr是老版本的结构体,sockaddr_in是新版本的结构体,构造参数的时候使用sockaddr_in,传参的时候强转为sockaddr

sockaddr_in的结构体,可通过man 7 ip查看

       struct sockaddr_in {
           sa_family_t    sin_family; /* address family: AF_INET */
           in_port_t      sin_port;   /* port in network byte order */
           struct in_addr sin_addr;   /* internet address */
       };

       /* Internet address. */
       struct in_addr {
           uint32_t       s_addr;     /* address in network byte order */
       };

参数说明:

  • sin_family: ip地址协议簇
  • sin_port: 端口号,通过字节序转换函数转化
  • sin_addr:ip地址,通过字节序转换函数转化

3. 函数

3.1 套接字创建函数

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int socket(int domain, int type, int protocol);

参数说明:

  • domain: 协议簇。AF_INET、AF_UNIX等
  • type: 类型。SOCK_STREAM(流式协议)、SOCK_DGRAM(报式协议)等
  • protocol: 指定的协议,通常使用0表示默认协议。TCP、UDP等
  • 返回值: 文件描述符,失败返回-1,设置errorno

3.2 bind函数

       int bind(int socket, const struct sockaddr *address,
              socklen_t address_len);

参数说明:

  • socket: socket文件描述符
  • address: 绑定的ip和端口号
  • address_len: address结构体的长度

3.3 listen函数

指定同时建立的连接的最大数量,不是监听!!!

同时建立连接的连接。

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int listen(int sockfd, int backlog);

参数说明:

  • backlog: 数量

3.4 accept函数

接收一个新的连接

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数说明:

  • addr: 传出参数,调用后会存入客户端的地址
  • addrlen: 传入传出参数
  • 返回值: 新的socket文件描述符

3.5 connect函数

       #include <sys/types.h>          /* See NOTES */
       #include <sys/socket.h>

       int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);

参数说明:

  • sockfd:客户端的socket
  • addr: 服务器的地址
  • addrlen: 长度