linux sockaddr结构体,linux网络编程笔记 sockaddr_in结构体[转]
struct sockaddr {
unsigned short sa_family; char sa_data[14]; };
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。
但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构
sockaddr_in(在netinet/in.h中定义):
struct sockaddr_in {
short int sin_family; unsigned short int sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8]; };
struct in_addr {
unsigned long s_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;
sin_family指代协议族,在socket编程中只能是AF_INET
sin_port存储端口号(使用网络字节顺序)
sin_addr存储IP地址,使用in_addr这个数据结构
sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
s_addr按照网络字节顺序存储IP地址
sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
在最后用进行类型转换就可以了bzero((char*)&mysock,sizeof(mysock));//初始化
mysock结构体名
mysock.sa_family=AF_INET;
mysock.sin_addr.s_addr=inet_addr("192.168.0.1");
……
等到要做转换的时候用:
(struct sockaddr*)mysock
想来你是要进行网络编程,使用socket, listen, bind等函数。
你只要记住,填值的时候使用sockaddr_in结构,而作为函数的参数传入的时候转换成sockaddr结构就行了,毕竟都是16个字符长。
IP 地址和如何处理它们现在我们很幸运,因为我们有很多的函数来方便地操作 IP
地址。没有 必要用手工计算它们,也没有必要用"<
首先,假设你已经有了一个sockaddr_in结构体ina,你有一个IP地
址"132.241.5.10"要储存在其中,你就要用到函数inet_addr(),将IP地址从
点数格式转换成无符号长整型。使用方法如下:
ina.sin_addr.s_addr =
inet_addr("132.241.5.10");注意,inet_addr()返回的地址已经是网络字节格式,所以你无需再调用函数htonl()。
我们现在发现上面的代码片断不是十分完整的,因为它没有错误检查。
显而易见,当inet_addr()发生错误时返回-1。记住这些二进制数字?(无符号数)-1仅仅和IP地址255.255.255.255相符合!这可是广播地址!大错特
错!记住要先进行错误检查。
好了,现在你可以将IP地址转换成长整型了。有没有其相反的方法呢?
它可以将一个in_addr结构体输出成点数格式?这样的话,你就要用到函数
inet_ntoa()("ntoa"的含义是"network to ascii"),就像这样:
printf("%s",inet_ntoa(ina.sin_addr));
它
将输出IP地址。需要注意的是inet_ntoa()将结构体in-addr作为一个参数,不是长整形。同样需要注意的是它返回的是一个指向一个字符的
指针。它是一个由inet_ntoa()控制的静态的固定的指针,所以每次调用
inet_ntoa(),它就将覆盖上次调用时所得的IP地址。
linux sockaddr结构体,linux网络编程笔记 sockaddr_in结构体[转]相关推荐
- linux和网络编程笔记
第一部分.章节目录 3.4.1.程序的开始和结束 3.4.2.进程环境 3.4.3.进程的正式引入 3.4.4.fork创建子进程 3.4.5.父子进程对文件的操作 3.4.6.进程的诞生和消亡 3. ...
- linux下C语言socket网络编程简例
转自博文:http://blog.csdn.net/kikilizhm/article/details/7858405 在练习写网络编程时,该例给了我帮助,在写服务器时,我把while逻辑位置想法错了 ...
- Linux多线程、多进程、网络编程常见问题
Linux多进程.多线程.网络编程常见问题 入门 1.GCC的工作流程? 工作流程: 预处理.编译.汇编.链接 具体流程如下: 2.gcc常用的参数选项 3.Makefile介绍 3.1.Makefi ...
- linux常见命令以及shell入门编程(笔记总结记录)
linux常见命令以及shell入门编程(笔记总结记录) 文章目录 linux常见命令以及shell入门编程(笔记总结记录) 一.linux常见命令 1.不常用 2.常用 3.数据查找处理相关 1.g ...
- TCP/IP 网络编程笔记 第三章 地址族与数据序列
文章目录 3.1 分配给套接字的 IP 地址与端口号 3.1.1 网络地址(Internet Address) 3.1.2 网络地址分类与主机地址边界 3.1.3 用于区分套接字的端口号 3.2 地址 ...
- Java网络编程笔记5
在Java网络编程笔记4中我们看到了客户端与服务器通信的过程,只是在前面的程序只是单个客户端与服务器通信 的例子. 接下来我们看如何实现多个客户端与服务器通信,对于服务器来说,它要为每个客户端请求的S ...
- c语言如何宏定义枚举型结构体,C语言学习笔记--枚举结构体
枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...
- 进程fork和exec ---Unix网络编程笔记
进程fork和exec ---Unix网络编程笔记 fork 一次调用,两次返回 fork的两个典型用法 最简单的并发服务器---fork子进程 exec -Unix网络编程笔记) fork #inc ...
- linux网络编程之地址结构sockaddr和sockaddr_in的区别
1.介绍sockaddr 结构体struct sockaddr在/usr/include/linux/socket.h中定义 struct sockaddr {unsigned short sa_fa ...
最新文章
- 11.05 scrum report
- mysql router手册_mysql router
- 在.NET 2.0正式版中开发无刷新页面
- strip 命令的使用方法
- priority_queue+贪心:运输(题解)
- 细说WCF中的会话模式
- 将python中的小数直接进位的函数_python保留小数位的三种实现方法
- Throwable、Error、Exception、RuntimeException 区别
- paip.网站接入QQ登录总结
- php bin2hex park,PHP bin2hex()函数与示例
- IARPA启动“奥丁”项目,发展生物特征识别技术
- FastAPI 构建 API 服务,究竟有多快?
- Pikachu漏洞练习平台----验证码绕过(on server) 的深层次理解
- 小红书X千瓜联合发布|小红书2021年4月创作者红人榜
- 说说filter这个css属性(网站置灰实现)
- 前端代码调试:Webstorm调试js
- P1386 座位安排
- (七)Spring Security (spring-cloud-starter-oauth2)应用详解------认证授权服务------授权码模式和密码模式
- Libevent 学习一:Libevent 源码编译
- 520浪漫情人节可爱少女风格PPT模板