3 套接字编程简介
2013-02-21 17:01
274 查看
2012年刚刚把tcp/ip详解看完,受益匪浅,新年伊始,开始研究UNP,由于前两章和tcp/ip详解的内容差不多,就没在此总结,直接从第3章开始研究,欢迎有类似爱好的朋友留言一起交流学习,ok,let's go。。。。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/struggle.gif)
![](http://img.my.csdn.net/uploads/201302/21/1361437803_7682.JPG)
![](http://img.my.csdn.net/uploads/201302/21/1361437904_4608.JPG)
首先,这里最常用的3个字段sin_family,sin_addr,sin_port,其数据类型为uint8_t uint32_t uint16_t,其中sin_port被定义为网络字节序,标准定义方法如下:
![](http://img.my.csdn.net/uploads/201302/21/1361439617_4869.JPG)
其定义在<sys/socket.h>中,套接字函数对于套接字参数的传递,都采用这个,如bind函数定义如下,当然传递时,数据类型是要强转的。
![](http://img.my.csdn.net/uploads/201302/21/1361440159_6280.JPG)
![](http://img.my.csdn.net/uploads/201302/21/1361441069_3072.JPG)
![](http://img.my.csdn.net/uploads/201302/22/1361505213_6623.JPG)
![](http://img.my.csdn.net/uploads/201302/22/1361512494_9896.JPG)
其中h标识host,n标识network,s标识short,l标识long,当需要转换16位或者32位字节数时,需要调用上述4个函数,如果本身主机是大端序,又调用转换为大端序的函数,其函数不起作用。
对于inet_addr函数,其无效返回值INADDR_NONE为32位最大值,而255.255.255.255其值正好为INADDR_NONE,所以函数对255.255.255.255无法处理。所以,我们不推荐采用inet_addr函数,最好采用inet_aton,其返回值是可靠的。
在来看下面俩函数,其对于IPV4和IPV6都是可用的,前面介绍那3个仅对IPV4有效。
![](http://img.my.csdn.net/uploads/201302/22/1361516571_9550.JPG)
family:AF_INET或者AF_INET6,否则返回错误。其addrptr类型对于IPV4为in_addr,对于IPV6为in6_addr
总结:上面一共介绍了5个函数一套是专门给IPV4用的,一套是IPV4和IPV6公用的,在这里,推荐给大家使用下面两个函数,原因是其有返回值来判断转换成功与否,行为更为安全。
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/struggle.gif)
第3章 套接字编程简介
3.1 IPV4套接字地址结构
先来看下ipv4套接字地址结构,其定义在<netinet/in.h>首先,这里最常用的3个字段sin_family,sin_addr,sin_port,其数据类型为uint8_t uint32_t uint16_t,其中sin_port被定义为网络字节序,标准定义方法如下:
struct sockaddr_in servaddr; bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(1234); servaddr.sin_addr.s_addr = inet_addr(172.16.1.212);
3.2 通用套接字地址结构
其定义在<sys/socket.h>中,套接字函数对于套接字参数的传递,都采用这个,如bind函数定义如下,当然传递时,数据类型是要强转的。
int bind(int sockfd,struct sockaddr * my_addr,int addrlen); bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr));
3.3 IPV6套接字地址结构
ipv6套接字地址结构定义在<netinet/in.h>中,定义如下3.4 不同套接字地址结构比较
3.4 字节排序函数
其字节顺序及判断方法如下所示:#include <stdio.h> void main() { unsigned short num = 0xAABB; char * p = (char *)(&num); if (0xAA == *p) { printf("big\n"); } else if(0xBB == *p) { printf("short\n"); } else { ; } }
其中h标识host,n标识network,s标识short,l标识long,当需要转换16位或者32位字节数时,需要调用上述4个函数,如果本身主机是大端序,又调用转换为大端序的函数,其函数不起作用。
3.5 地址转换函数
#include <arpa/inet.h> // 地址字符串IPV4地址172.16.1.212与struct in_addr相互转换 // str->in_addr,若字符串有效则返回1,否则为0 int inet_aton(const char *strptr, struct in_addr *addrptr); // str->in_addr,如果地址无效则返回INADDR_NONE in_addr_t inet_addr(const char *strptr); // in_addr->str char *inet_ntoa(struct in_addr inaddr);
对于inet_addr函数,其无效返回值INADDR_NONE为32位最大值,而255.255.255.255其值正好为INADDR_NONE,所以函数对255.255.255.255无法处理。所以,我们不推荐采用inet_addr函数,最好采用inet_aton,其返回值是可靠的。
在来看下面俩函数,其对于IPV4和IPV6都是可用的,前面介绍那3个仅对IPV4有效。
family:AF_INET或者AF_INET6,否则返回错误。其addrptr类型对于IPV4为in_addr,对于IPV6为in6_addr
总结:上面一共介绍了5个函数一套是专门给IPV4用的,一套是IPV4和IPV6公用的,在这里,推荐给大家使用下面两个函数,原因是其有返回值来判断转换成功与否,行为更为安全。
相关文章推荐
- 第三章 套接字编程简介
- Unix网络编程(三)--套接字编程简介
- UNP第3章 套接字编程简介
- 套接字编程简介
- UNIX网络编程---套接字编程简介(三)
- UNIX网络编程卷一:第三章 套接字编程简介
- 套接字编程简介
- UNPv1第三章:套接字编程简介
- UNP-UNIX网络编程 第三章:套接字编程简介
- UNIX网络编程卷一 笔记 第三章 套接字编程简介
- UNP读书笔记 第3章 套接字编程简介
- Unix网络编程三——套接字编程简介
- UNP总结 Chapter 3 套接字编程简介
- 【unix网络编程第三版】阅读笔记(二):套接字编程简介
- UNIX网络编程笔记(2)—套接字编程简介
- Unix网络编程 卷1 第3章:套接字编程简介(套接字地址结构)
- 《UNIX网络编程卷1》读书笔记--第三章套接字编程简介
- 【unix网络编程第三版】阅读笔记(二):套接字编程简介
- UNIX 网络编程笔记-CH3:套接字编程简介
- UNIX网络编程第3章套接字编程简介3.2套接字地址结构3.3值结果参数3.4字节排序函数