SOCKET

1) IPv4套接字地址结构
IPv4套接字地址结构通常也称为“网际套接字地址结构”,以sockaddr_in命名,定义在 头文件中。

  1. struct in_addr{
  2.       in_addr_t s_addr; //32bits IPv4 address,network byte ordered
  3.      };
  4.       
  5.     struct sockaddr_in{
  6.       uint8_t sin_len;
  7.       sa_family_t sin_family; //AF_INET(IPv4), AF_INET6(IPv6)
  8.       in_port_t sin_port; //16bits TCP or UDP port number network byte ordered
  9.       struct in_addr sin_addr; //32bits IPv4 address network byte ordered
  10.       char sin_sero[8];
  11.      }
POSIX规范只要求sin_family,sin_port,sin_addr 三个字段即可。
其中sin_port,sin_addr必须以网络字节序传输,所以出现转换函数。
1. 端口转换函数
    
  1. u_long htonl(u_long); //3、主机到网络long形转换
  2. u_long ntohl(u_long); //4、网络到主机long形转换

  3. u_short htons(u_short); //5、主机到网络short形转换
  4. u_short ntohs(u_short); //6、网络到主机short形转换


2. 地址转换函数
inet_aton, inet_ntoa, inet_addr在点分十进制("1.1.1.1")和长度为32位的网络字节序二进制值间转换。

   
  1. int inet_aton(const char *strptr, struct in_addr *addrptr); //"1.1.1.1"-> 0002038
  2. in_addr_t inet_addr(const char *strptr); //该函数有bug,建议弃用。"1.1.1.1"-> 0002038
  3. char *inet_ntoa(struct in_addr inaddr);//0002038->"1.1.1.1"

2)socket函数

  1. 指定期望的通信协议类型
  2. @family,指明协议族,IPV4, IPV6, Unix域协议
    @type  ,套接字类型,字节流套接字,数据报套接字
  3. @protocol,协议类型,如TCP传输协议,UDP传输协议,
  4. int socket(int family, int type, int protocol);
AF_XXX指地址族,PF_XXX指协议族

3)bind
   
  1. 把一个本地协议地址赋予一个套接字
  2. @sockfd,
  3. @myaddr,
  4. @addrlen,
  5. int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen);
1. 绑定端口
  如果一个TCP客户或服务器未曾调用bind绑定一个端口,当调用connect或listen时,内核就要为相应的套接字选择一个临时端口。
2. 绑定IP
  对应TCP服务器,绑定到特定IP地址,则该套接字只接收那些目的地为这个IP地址的客户连接。

4)listen
   
  1. 当socket()创建一个套接字时,他被假设为一个主动套接字。也就是说,他是一个将调用connect发起连接的客户套接字
  2. listen()把一个未连接的套接字转换为一个被动套接字,指示内核应接受该套接字的连接请求。
  3. @sockfd,
  4. @backlog,规定内核应该为相应套接字排队的最大连接个数
  5. int listen(int sockfd, int backlog);
1. 内核为任何一个给定的监听套接字维护两个队列
a)未完成连接队列:已由客户发出并到达服务器,服务器正等待完成TCP的三次握手,均为SYN_RCVD状态
b)已完成连接队列:已完成TCP三次握手的套接字,处于ESTABLISHED状态
   三次握手后,套接字就由“未完成连接队列”移到“已完成连接队列”的队尾。
5)connect
   
  1. @sockfd,
  2. @serveraddr,包含服务器的IP和端口
  3. @addrlen,
  4. int connect(int sockfd, const struct sockaddr *serveraddr, socklen_t addrlen);
6)accept
   
  1. 从已完成连接队列的队头返回下一个已完成连接的套接字
  2. @sockfd,
  3. @clientaddr,已连接的客户的协议地址
  4. @addrlen,
  5. int connect(int sockfd, const struct sockaddr *clientaddr, socklen_t addrlen);
7)close
   
  1. 将套接字标记为已关闭,返回进程。TCP将发送未发送的数据,最终发送正常的TCP连接终止序列。
  2. @sockfd,
  3. int close(int sockfd);

<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>
阅读(171) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kelsel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值