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: 长度