网络编程--sockaddr 与 sockaddr_in
From: http://www.it165.NET/pro/html/201211/4066.html
在初学的时候对二者甚是迷茫一会就晕了
在这里总结一句话:
struct sockaddr 这个结构体是linux的网络编程接口中用来表示IP地址的标准结构体,bind、connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的。在实际编程中这个结构体会被一个struct sockaddr_in所填充。
sockaddr 在bind的man手册中提到
struct sockaddr {sa_family_t sa_family; //所选协议族AF_INETchar sa_data[14]; //ip地址及端口号}
而sockaddr_in
{__SOCKADDR_COMMON (sin_);in_port_t sin_port; /* Port number. */struct in_addr sin_addr; /* Internet address. */unsigned char sin_zero[sizeof (struct sockaddr) -__SOCKADDR_COMMON_SIZE -sizeof (in_port_t) -sizeof (struct 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));
网络编程--sockaddr 与 sockaddr_in相关推荐
- 网络编程——sockaddr 与 sockaddr_in
struct sockaddr 这个结构体是linux的网络编程接口中用来表示IP地址的标准结构体,bind.connect等函数中都需要这个结构体,这个结构体是兼容IPV4和IPV6的. 在实际编程 ...
- 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 ...
最新文章
- 口罩检测识别率惊人,这个Python项目开源了
- ASP.NET MVC + ECharts图表案例
- 【NLP】NLP从业人员必须知道的十大必备知识库(附资料下载)
- A01_[NumPy中文网]数组基础(创建数组,多维数组切片,数组属性)、使用数组(基本操作符,数组特殊运算符)、索引(花式索引,布尔索引,缺省索引)
- SpringToolsSuite (STS)或Eclipse安装gradle
- 先定个小目标, 使用C# 开发的千万级应用
- Vue 页面如何利用生命周期函数监听用户预览时长
- 客户端脚本调用服务器端动态内容,移动到链接显示预览
- 简单粗暴入门JAVA之方法
- oracle复合字段,复合索引 选择频繁的字段,还是选择选择性低的字段 放在前面?...
- 网站开发中很有用的几个 jQuery 地图插件
- win2003服务器安全设置
- js原生获取html的高度,js中怎么获得浏览器的高度?
- 【NVivo教程】使用Nvivo扩展文献综述
- linux vim输入法切换,完美解决Mac下Vim/Emacs的输入法切换问题
- Android仿微信群聊头像合成
- 设置非阻塞socket收发数据
- 2.安装node-red
- 《欢乐颂2》狗血的剧情才是生活该有的模样
- EBS 并发请求 计划 fnd_conc_release_classes
热门文章
- 实验4-2-3 pta验证“哥德巴赫猜想” (20分)
- POJ1753 棋盘翻转(位压缩+广度优先搜索)
- Docker入门-docker compose的使用
- C#中的深复制与浅复制
- caffe学习(1) ubunu 16.04+caffe+cuda8.0+opencv3.1安装
- ajax获取后台数据出错parsererror
- Python学习之路day03——010函数(类似Java中的方法)
- 数据结构(十八)树的定义与存储结构
- 正弦水波纹波动画 - SJWaveView
- python——面向对象篇之异常和反射