socket编程——sockaddr_in结构体操作
来源:互联网 发布:樱井知香迅雷种子磁力 编辑:程序博客网 时间:2024/05/19 20:18
http://blog.sina.com.cn/s/blog_6151984a0100etj1.html
sockaddr的缺陷:sa_data把目标地址和端口信息混在一起了
struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};
sa_family是通信类型,最常用的值是 "AF_INET"
sa_data14字节,包含套接字中的目标地址和端口信息
char sa_data[14];
};
sa_family是通信类型,最常用的值是 "AF_INET"
sa_data14字节,包含套接字中的目标地址和端口信息
sockaddr_in结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中
struct sockaddr_in {
short int sin_family;
unsigned short int sin_port;
struct in_addr sin_addr;
struct in_addr {
unsigned long s_addr;
}
unsigned char sin_zero[8];
}
short int sin_family;
unsigned short int sin_port;
struct in_addr {
}
一般可视化的数字都是HBO(本机字节顺序)
struct sockaddr_in cliaddr;
bzero(&cliaddr,sizeof(cliaddr));
bzero(&cliaddr,sizeof(cliaddr));
struct sockaddr_in ina;
bzero(&ina,sizeof(ina));
ina.sin_family=AF_INET;
ina.sin_port=htons(23);
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
bzero(&ina,sizeof(ina));
ina.sin_family=AF_INET;
ina.sin_port=htons(23);
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
一般先把sockaddr_in变量赋值后,强制类型转换后传入用sockaddr做参数的函数
-
sockaddr_in用于socket定义和赋值 -
sockaddr用于函数参数
对于源、目的地址和源、目的地址端口,需要建立两个socket变量
cliaddr绑定源地址和源端口
servaddr用于connect和sendto的设定目的地址和目的端口
struct sockaddr_in servaddr,cliaddr;
create_socket(char *server_addr_string,unsigned int server_port)
{
源socket赋值
目的socket赋值
}
结构体的sin_port和sin_addr都必须是NBO
一般可视化的数字都是HBO
inet_addr()
inet_aton()
inet_ntoa ()
htons()
htonl()
ntohs()
ntohl()
常用的是htons(),inet_addr()正好对应结构体的端口类型和地址类型
inet_aton(server_addr_string,&myaddr.sin_addr);myaddr.sin_addr.s_addr = inet_addr("132.241.5.10");INADDR_ANY转不转NBO随便
myaddr.sin_addr.s_addr = htons(INADDR_ANY);
myaddr.sin_addr.s_addr = INADDR_ANY;
#define MYPORT 3490
myaddr.sin_port = htons(MYPORT);
0(随机端口)转不转NBO随便
myaddr.sin_port = htons(0);
myaddr.sin_port = 0;
唯一可以用于地址转换的htons是针对INADDR_ANY
-
inet_addr() 是返回值型
ina.sin_addr.s_addr = inet_addr("132.241.5.10");
-
inet_aton() 是参数指针型
inet_aton("132.241.5.10",&ina.sin_addr);
参数:结构体变量.sinaddr
返回值:字符串指针
a1 = inet_ntoa(ina.sin_addr);
printf("address 1: %s\n",a1);
address 1: 132.241.5.10
因为inet_addr()的结果是整型,而发生错误时返回-1。
而 ina.sin_addr.s_addr是unsigned long型
-1在long short显示成111111111,和IP地址255.255.255.255相符合!会被误认为广播地址!
0 0
- [gcc编程] socket编程——sockaddr_in结构体操作
- [gcc编程] socket编程——sockaddr_in结构体操作
- socket编程——sockaddr_in结构体操作
- socket编程——sockaddr_in结构体操作
- socket编程——sockaddr_in结构体操作
- socket编程——sockaddr_in结构体操作
- socket编程——sockaddr_in结构体操作
- socket编程——sockaddr_in结构体操作
- socket编程——sockaddr_in结构体操作
- socket编程——sockaddr_in结构体操作
- socket编程:sockaddr_in结构体操作
- 结构体操作
- List 结构体操作
- C 结构体操作
- c语言结构体操作
- linux socket 编程之 —— sockaddr与sockaddr_in结构体
- 结构体操作的坏味道
- 用指针对结构体操作
- ubuntu不能解析域名No address associated with hostname
- 端口转发工具
- Myeclipse java 项目转换为 web 项目
- InDesign插件开发中的ODFRC
- Android —— Display
- socket编程——sockaddr_in结构体操作
- 存储过程 创建全局临时表
- meta中的viewport指令
- 网络协议消息分片
- vs2005编译pjsip
- (Memory and Resource) Leak detection for WinCE
- soj2093: Farmer John
- GUI 创建个Frame,往里面插入Panel,Panel的大小随Frame大小调整 setLayout setBounds
- Linux下.sh文件语法