1) IPv4套接字地址结构
IPv4套接字地址结构通常也称为“网际套接字地址结构”,以sockaddr_in命名,定义在 头文件中。
POSIX规范只要求sin_family,sin_port,sin_addr
三个字段即可。
其中sin_port,sin_addr必须以网络字节序传输,所以出现转换函数。
1. 端口转换函数
2. 地址转换函数
inet_aton, inet_ntoa, inet_addr在点分十进制("1.1.1.1")和长度为32位的网络字节序二进制值间转换。
2)socket函数
AF_XXX指地址族,PF_XXX指协议族
3)bind
1. 绑定端口
如果一个TCP客户或服务器未曾调用bind绑定一个端口,当调用connect或listen时,内核就要为相应的套接字选择一个临时端口。
2. 绑定IP
对应TCP服务器,绑定到特定IP地址,则该套接字只接收那些目的地为这个IP地址的客户连接。
4)listen
1. 内核为任何一个给定的监听套接字维护两个队列
a)未完成连接队列:已由客户发出并到达服务器,服务器正等待完成TCP的三次握手,均为SYN_RCVD状态
b)已完成连接队列:已完成TCP三次握手的套接字,处于ESTABLISHED状态
三次握手后,套接字就由“未完成连接队列”移到“已完成连接队列”的队尾。
5)connect
6)accept
7)close
阅读(171) | 评论(0) | 转发(0) |
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
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];
- }
其中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);
3)bind
- 把一个本地协议地址赋予一个套接字
- @sockfd,
- @myaddr,
- @addrlen,
- int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
如果一个TCP客户或服务器未曾调用bind绑定一个端口,当调用connect或listen时,内核就要为相应的套接字选择一个临时端口。
2. 绑定IP
对应TCP服务器,绑定到特定IP地址,则该套接字只接收那些目的地为这个IP地址的客户连接。
4)listen
- 当socket()创建一个套接字时,他被假设为一个主动套接字。也就是说,他是一个将调用connect发起连接的客户套接字。
- listen()把一个未连接的套接字转换为一个被动套接字,指示内核应接受该套接字的连接请求。
- @sockfd,
- @backlog,规定内核应该为相应套接字排队的最大连接个数
- int listen(int sockfd, int backlog);
a)未完成连接队列:已由客户发出并到达服务器,服务器正等待完成TCP的三次握手,均为SYN_RCVD状态
b)已完成连接队列:已完成TCP三次握手的套接字,处于ESTABLISHED状态
三次握手后,套接字就由“未完成连接队列”移到“已完成连接队列”的队尾。
5)connect
- @sockfd,
- @serveraddr,包含服务器的IP和端口
- @addrlen,
- int connect(int sockfd, const struct sockaddr *serveraddr, socklen_t addrlen);
- 从已完成连接队列的队头返回下一个已完成连接的套接字
- @sockfd,
- @clientaddr,已连接的客户的协议地址
- @addrlen,
- int connect(int sockfd, const struct sockaddr *clientaddr, socklen_t addrlen);
- 将套接字标记为已关闭,返回进程。TCP将发送未发送的数据,最终发送正常的TCP连接终止序列。
- @sockfd,
- int close(int sockfd);
相关热门文章
给主人留下些什么吧!~~
评论热议