您的位置:首页 > 编程语言

3 套接字编程简介

2013-02-21 17:01 274 查看
2012年刚刚把tcp/ip详解看完,受益匪浅,新年伊始,开始研究UNP,由于前两章和tcp/ip详解的内容差不多,就没在此总结,直接从第3章开始研究,欢迎有类似爱好的朋友留言一起交流学习,ok,let's go。。。。


第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公用的,在这里,推荐给大家使用下面两个函数,原因是其有返回值来判断转换成功与否,行为更为安全。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: