1) IPv4套接字地址结构
IPv4套接字地址结构通常也称为“网际套接字地址结构”,以sockaddr_in命名,定义在
头文件中。
-
struct in_addr{
-
in_addr_t s_addr; //32bits IPv4 address,network byte ordered
-
};
-
-
struct sockaddr_in{
-
uint8_t sin_len;
-
sa_family_t sin_family; //AF_INET(IPv4), AF_INET6(IPv6)
-
in_port_t sin_port; //16bits TCP or UDP port number network byte ordered
-
struct in_addr sin_addr; //32bits IPv4 address network byte ordered
-
char sin_sero[8];
-
}
POSIX规范只要求sin_family,sin_port,sin_addr三个字段即可。
其中sin_port,sin_addr必须以网络字节序传输,所以出现转换函数。
1. 端口转换函数
-
u_long htonl(u_long); //3、主机到网络long形转换
-
u_long ntohl(u_long); //4、网络到主机long形转换
-
-
u_short htons(u_short); //5、主机到网络short形转换
-
u_short ntohs(u_short); //6、网络到主机short形转换
2. 地址转换函数
inet_aton, inet_ntoa, inet_addr在点分十进制("1.1.1.1")和长度为32位的网络字节序二进制值间转换。
-
int inet_aton(const char *strptr, struct in_addr *addrptr); //"1.1.1.1"-> 0002038
-
in_addr_t inet_addr(const char *strptr); //该函数有bug,建议弃用。"1.1.1.1"-> 0002038
-
char *inet_ntoa(struct in_addr inaddr);//0002038->"1.1.1.1"
2)socket函数
-
指定期望的通信协议类型
-
@family,指明协议族,IPV4, IPV6, Unix域协议
@type ,套接字类型,字节流套接字,数据报套接字
-
@protocol,协议类型,如TCP传输协议,UDP传输协议,
-
int socket(int family, int type, int protocol);
AF_XXX指地址族,PF_XXX指协议族
3)bind
-
把一个本地协议地址赋予一个套接字
-
@sockfd,
-
@myaddr,
-
@addrlen,
-
int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
1. 绑定端口
如果一个TCP客户或服务器未曾调用bind绑定一个端口,当调用connect或listen时,内核就要为相应的套接字选择一个临时端口。
2. 绑定IP
对应TCP服务器,绑定到特定IP地址,则该套接字只接收那些目的地为这个IP地址的客户连接。
4)listen
-
当socket()创建一个套接字时,他被假设为一个主动套接字。也就是说,他是一个将调用connect发起连接的客户套接字。
-
listen()把一个未连接的套接字转换为一个被动套接字,指示内核应接受该套接字的连接请求。
-
@sockfd,
-
@backlog,规定内核应该为相应套接字排队的最大连接个数
-
int listen(int sockfd, int backlog);
1. 内核为任何一个给定的监听套接字维护两个队列
a)未完成连接队列:已由客户发出并到达服务器,服务器正等待完成TCP的三次握手,均为SYN_RCVD状态
b)已完成连接队列:已完成TCP三次握手的套接字,处于ESTABLISHED状态
三次握手后,套接字就由“未完成连接队列”移到“已完成连接队列”的队尾。
5)connect
-
@sockfd,
-
@serveraddr,包含服务器的IP和端口
-
@addrlen,
-
int connect(int sockfd, const struct sockaddr *serveraddr, socklen_t addrlen);
6)accept
-
从已完成连接队列的队头返回下一个已完成连接的套接字
-
@sockfd,
-
@clientaddr,已连接的客户的协议地址
-
@addrlen,
-
int connect(int sockfd, const struct sockaddr *clientaddr, socklen_t addrlen);
7)close
-
将套接字标记为已关闭,返回进程。TCP将发送未发送的数据,最终发送正常的TCP连接终止序列。
-
@sockfd,
-
int close(int sockfd);
阅读(548) | 评论(0) | 转发(0) |