socket操作
1.1 创建socket
int socket(int domain, int type, int protocol);
domain: 确定通信的特性
AF_INET IPv4因特网域
AF_INET6 IPv6因特网域
AF_UNIX UNIX域
AF_UNSPEC 未指定
type: 指定套接字的类型
SOCK_DGRAM 长度固定的、无连接的不可靠报文传递
SOCK_RAW IP协议的数据报接口(POSIX.1中可选)
SOCK_SEQPACKET 长度固定、有序、可靠的面向连接报文传递
SOCK_STREAM 有序、可靠、双向的面向连接字节流
protocol参数通常是0,表示按给定的域和套接字类型选择默认协议。当同一域和套接字类型支持多个协议的时候,可以使用protocol参数选择一个特定的协议。
AF_INET通信域中套接字类型SOCK_STREAM的默认协议是TCP(传输控制协议)
AF_INET通信与中套接字类型SOCK_DGRAM的默认协议是UDP(用户数据报协议)
1.2 绑定地址(server)
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
sockfd: 要绑定的套接字
my_addr: 地址结构体
addrlen: 结构体长度,通常为sizeof(my_addr)
1.2.1 struct sockaddr
该结构体定义了地址信息
struct sockaddr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
};
1.2.2 网络字节转换
网络中的数据格式为大端,所以需要将小端存储的数据转换成为大端存储,一下为网络字节序和本地字节序(小端)之间转换函数
uint32_t htonl(uint32_t hostint32); /// host to net long(uint32_t)
uint16_t htons(uint16_t hostint16); /// host to net short(uint16_t)