Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1543027
  • 博文数量: 596
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 173
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-06 15:50
个人简介

在线笔记

文章分类

全部博文(596)

文章存档

2016年(1)

2015年(104)

2014年(228)

2013年(226)

2012年(26)

2011年(11)

分类: Windows平台

2014-01-03 12:02:40

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);

阅读(546) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~