网络编程——sockaddr 与 sockaddr_in
struct sockaddr 这个结构体是linux的网络编程接口中用来表示IP地址的标准结构体,bind、connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的。
在实际编程中这个结构体会被一个struct sockaddr_in所填充。
sockaddr
用于存储参与(IP)Windows套接字通信的计算机上的一个internet协议(IP)地址。为了统一地址结构的表示方法 ,统一接口函数,使得不同的地址结构可以被bind()、connect()、recvfrom()、sendto()等函数调用。但一般的编程中并不直接对此数据结构进行操作,而使用另一个与之等价的数据结构sockaddr_in。这是由于Microsoft TCP/IP套接字开发人员的工具箱仅支持internet地址字段,而实际填充字段的每一部分则遵循sockaddr_in数据结构,两者大小都是16字节,所以二者之间可以进行切换。
sockaddr 在bind的man手册中提到
struct sockaddr
{sa_family_t sa_family; //所选协议族AF_INETchar sa_data[14]; //ip地址及端口号
}
而sockaddr_in
struct sockaddr_in {short int sin_family; /* Address family */unsigned short int sin_port; /* Port number */struct in_addr sin_addr; /* Internet address */unsigned char sin_zero[8]; /* Same size as struct sockaddr */};sin_family:指代协议族,在socket编程中只能是AF_INETsin_port:存储端口号(使用网络字节顺序)sin_addr:存储IP地址,使用in_addr这个数据结构sin_zero:是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
而其中in_addr结构的定义如下:
typedef struct in_addr {union {struct{ unsigned char s_b1,s_b2, s_b3,s_b4;} S_un_b;struct{ unsigned short s_w1, s_w2;} S_un_w;unsigned long S_addr;} S_un;} IN_ADDR;
虽然是两个结构体可是二者的占用的内存是一致的,因此可以互相转化。
sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息。是一种通用的套接字地址。
而sockaddr_in 一般是储存地址和端口的。用于信息的显示及存储使用
例如:
struct sockaddr_in addr_server;addr_server.sin_family = AF_INET;
addr_server.sin_port = htons(RPORT);
addr_server.sin_addr.s_addr = inet_addr(RHOST);
然而,在类似于bind accept的函数中
ret = bind(fd_sock, (struct sockaddr *)&addr_server, sizeof(addr_server));
if(ret < 0)
{perror("bind");return -1;
}
之前只是这样的记下来了,可是知道一天,想显示所连接的客户端的ip地址的时候,就发现了问题所在
char *inet_ntoa(struct in_addr in);
函数原型是这样的,可是在
struct in_addr
{in_addr_t s_addr;
};
这个in_addr是sockaddr_in的一个mamber
fd_connection = accept(fd_sock, (struct sockaddr *)&addr_client, &addr_client_len);if(fd_connection < 0){perror("accept");return -1;}printf("connected! : %d\n", fd_connection);printf("%s%s\n", "the client ip is :", inet_ntoa(addr_client.sin_addr));
转载于:https://www.cnblogs.com/wuyepeng/p/9721546.html
网络编程——sockaddr 与 sockaddr_in相关推荐
- 网络编程--sockaddr 与 sockaddr_in
From: http://www.it165.NET/pro/html/201211/4066.html 在初学的时候对二者甚是迷茫一会就晕了 在这里总结一句话: struct sockaddr 这个 ...
- linux下C语言套接字编程sockaddr和sockaddr_in的区别
tcp建立后,我想linux的服务端可以为每个连接的ip地址分配编号,方便进行每个客户端进行数据交互.所以我要知道每个连接的ip地址. struct sockaddr和struct sockaddr_ ...
- C语言网络编程函数与相关结构汇总
持续更新中- 服务器和客户端的一般流程 服务器端:socket()-->bind( )-->listen()-->accept()-->read()/write()---> ...
- 【Socket网络编程】2.sockaddr 和 sockaddr_in
sockaddr 和 sockaddr_in 参考 https://blog.csdn.net/ZWE7616175/article/details/80252048 sockaddr在/usr/in ...
- linux sockaddr结构体,linux网络编程笔记 sockaddr_in结构体[转]
struct sockaddr { unsigned short sa_family; char sa_data[14]; }; 此数据结构用做bind.connect.recvfrom.sendto ...
- 【C++】Winsock套接字编程,struct sockaddr、sockaddr_in,主机网络字节序
前一篇关于windows平台下winsock套接字编程的相关api struct sockaddr与struct sockaddr_in 在bind函数,connect函数里提到了套接字编程网络地址信 ...
- 【网络编程】Sockaddr与Sockaddr_in
在demo中,bind() 第二个参数的类型为 sockaddr,而代码中却使用 sockaddr_in,然后再强制转换为 sockaddr,这是为什么呢? 两者结构体对比 括号内为所占用的字节数: ...
- 【Linux网络编程学习】预备知识(网络字节序、IP地址转换函数、sockaddr数据结构)
此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 网络字节序 我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分. 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小 ...
- Linux套接字编程之sockaddr与sockaddr_in网络套接字,sockaddr_un进程间通信本地套接字
sockaddr struct sockaddr { unsigned short sa_family; /* address family, AF_xxx */ char sa_dat ...
最新文章
- 【Linux学习九】负载均衡
- STM32 ADC 同步规则模式 ADC1与ADC2同用一个DMA
- Ubuntu 16.04调节屏幕显示字体大小
- N个Java开发常用规范技巧总结
- 很好的Android论坛
- [css] 如何使用css实现跨浏览器的最小高度?
- SQL语句:建表语句、插入语句、查询语句、增加列、删除列、查询语句like、修改语句
- matlab计算16 1 3近似值,8. 科学计算软件Matlab中默认情况下π为近似值3.1416,该近似值与π真值的( )...
- 八个方便C#开发的省时的国外工具
- python 中m op n运算_Python数字类型、数值运算操作符、数值运算函数
- kotlin 循环_Kotlin控制流–否则,用于循环,同时,范围
- android classloader双亲托付模式
- HDU 2196 Computer 树形DP
- 真正解决办法:编译freeswitch错误,You must install libavformat-dev to build mod_av
- P-6002-10PK,P-6002-2PK脂质研究工具解析
- kubeadm部署单Master节点kubernetes集群 1.21.0
- html5 ios 键盘挡住输入框,IOS 键盘挡住输入框的问题解决办法
- DocSearcher:文档搜索引擎
- JavaScript-修炼之路第五层
- 学无止境,学无止境啊
热门文章
- SAP Netweaver和Hybris的数据库层
- 画世界上传图片提交到服务器_【MUI】选择图片并上传至服务器
- 初中计算机基础知识教程考试,2017年职称计算机考试基础知识教程详解(三十一)...
- thinkphp 助手函数url不生成https_thinkphp5.0 URL 地址生成
- python多级网址爬取_python-29:多级页面爬取源码
- 开启进度比的文本为什么没有显示_没有开通智钻,为什么会显示流量是在智钻进店的呢?...
- linux 怎么重装libaprutil,Apache安装出错_cannot install `libaprutil-1.la' to a directory
- c语言实现快速排序对文件中字符,C语言中快速排序和插入排序优化的实现
- palindromic java_Longest Palindromic Substring leetcode java
- pip keras 失败_关于 Python 机器学习导包失败 简短的补充