网络编程--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 ...
最新文章
- 东北黑木耳 微信公共帐号 销售 批发 分享 交流 东北鸿顺山特产品有限公司
- WinCvs提示:import requires write access to the repository
- 006_P名称空间的属性注入
- Django中的Session与Cookie
- Debian耳机声音问题
- locate: database too small: /var/db/locate.databas
- 《论文笔记》Multi-UAV Collaborative Monocular SLAM
- 将表达式树转换成中缀表达式☆
- 设计灵感|各种孟菲斯风格海报,让你眼花缭乱
- 配置网络策略中的 NAP 条件
- php调试代码时var_dump( )打印中文字符时出现乱码解决方案
- 13.程序员的自我修养---运行库实现
- JVM、JRE、JDK、java ee sdk with jdk四者的区别
- POJ 1273 EK算法
- 如何阻止华为杀应用_如何解决华为手机“杀后台”严重的情况呢?小技巧就能轻松搞定...
- 基于 arduino 的两轮自行车
- 2010年6月 工作 计划 发奋图钱 再接再厉
- c#子线程调用主线程控件
- Crane: 腾讯开源一款基于 FinOps 超强大云资源分析与成本优化平台
- 金山毒霸6 、金山网镖6 增强版 发布在即!!!
热门文章
- Java黑皮书课后题第11章:11.3(Account类的子类)在编程练习题9.7中定义了一个Account类来对一个银行账户建模。一个账户有账号、余额、年利率、开户日期等属性,以及存款和取款等方法
- Java黑皮书课后题第11章:11.2(Person Student Employee Faculty Staff类)设计一个名为Person的类及其两个名为Student和Employee的子类
- 2016年大学计算机期末试题及答案,2016年大学计算机基础试题题库及答案
- linux下什么文件不能修改,Linux和Unix下root也不能修改文件与目录的命令
- ASP.NET MVC 简单的分页思想与实现
- 如何扩展 Azure 资源组中虚拟机的 OS 驱动器
- js mysql 时间日期比较
- Android 查看设备文件
- 第六十节,文本元素标签
- SQL Server 索引结构及其使用(一)[转]