struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。

一、sockaddr

sockaddr在头文件#include <sys/socket.h>中定义,sockaddr的缺陷是:sa_data把目标地址和端口信息混在一起了,如下:

struct sockaddr {  sa_family_t sin_family;//地址族char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息               }; 

二、sockaddr_in

sockaddr_in在头文件#include<netinet/in.h>或#include <arpa/inet.h>中定义,该结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中,如下:

sin_port和sin_addr都必须是网络字节序(NBO),一般可视化的数字都是主机字节序(HBO)。

三、总结

二者长度一样,都是16个字节,即占用的内存大小是一致的,因此可以互相转化。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。

sockaddr常用于bind、connect、recvfrom、sendto等函数的参数,指明地址信息,是一种通用的套接字地址。
sockaddr_in 是internet环境下套接字的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作,使用sockaddr_in来建立所需的信息,最后使用类型转化就可以了。一般先把sockaddr_in变量赋值后,强制类型转换后传入用sockaddr做参数的函数:sockaddr_in用于socket定义和赋值;sockaddr用于函数参数。

例子如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>int main(int argc,char **argv)
{int sockfd;struct sockaddr_in mysock;sockfd = socket(AF_INET,SOCK_STREAM,0);  //获得fdbzero(&mysock,sizeof(mysock));  //初始化结构体mysock.sin_family = AF_INET;  //设置地址家族mysock.sin_port = htons(800);  //设置端口mysock.sin_addr.s_addr = inet_addr("192.168.1.0");  //设置地址bind(sockfd,(struct sockaddr *)&mysock,sizeof(struct sockaddr); /* bind的时候进行转化 */... ...return 0;
}

题外话,两个函数 htons() 和 inet_addr()。

htons()作用是将端口号由主机字节序转换为网络字节序的整数值。(host to net)

inet_addr()作用是将一个IP字符串转化为一个网络字节序的整数值,用于sockaddr_in.sin_addr.s_addr。

inet_ntoa()作用是将一个sin_addr结构体输出成IP字符串(network to ascii)。比如:

printf("%s",inet_ntoa(mysock.sin_addr));

htonl()作用和htons()一样,不过它针对的是32位的(long),而htons()针对的是两个字节,16位的(short)。

与htonl()和htons()作用相反的两个函数是:ntohl()和ntohs()。

参考:
《TCP/IP网络编程》
http://www.it165.net/pro/html/201211/4066.html
http://www.cnblogs.com/huqian23456/archive/2011/02/22/1961822.html

sockaddr和sockaddr_in详解相关推荐

  1. sockaddr和 sockaddr_in详解

    [转]socket编程--sockaddr_in结构体操作 sockaddr结构体 sockaddr的缺陷:sa_data把目标地址和端口信息混在一起了 struct sockaddr {       ...

  2. socket编程之sockaddr和sockaddr_in的区别

    sockaddr和sockaddr_in的区别 sockaddr和sockaddr_in详解 1.struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址 ...

  3. sockaddr与sockaddr_in,sockaddr_un结构体详解

    struct sockaddr { unsigned short sa_family;     /* address family, AF_xxx */ char sa_data[14];       ...

  4. sockaddr详解

    struct sockaddr {      unsigned short sa_family;   /* address family, AF_xxx */      char sa_data[14 ...

  5. C语言网络编程:accept函数详解

    文章目录 前言 函数描述 代码实例 如何得到客户端的IP 和 端口号 前言 当使用tcp服务器使用socket创建通信文件描述符,bind绑定了文件描述符,服务器ip和端口号,listen将服务器端的 ...

  6. 【网络编程】非阻塞connect详解

    一.为什么使用非阻塞connect TCP连接的建立涉及一个在三路握手过程,阻塞的connect一直等到客户收到自己的SYN的ACK才返回,这需要至少一个RTT时间,RTT时间波动很大从几毫秒到几秒. ...

  7. webSocket详解

    前言 本文会用实例的方式,将iOS各种IM的方案都简单的实现一遍.并且提供一些选型.实现细节以及优化的建议. 注:文中的所有的代码示例,在github中都有demo: iOS即时通讯,从入门到&quo ...

  8. linux epoll事件模型详解

    一.介绍 epoll是Linux(内核版本2.6及以上支持)下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件 ...

  9. Socket详解——全面明了

    "一切皆Socket!"原文链接 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间 ...

最新文章

  1. Windows 10系统中如何显示文件后缀名
  2. 如何自学Python?这本技术大咖推荐Python书籍,就是你的第一选择
  3. IDEA 热启动,每次更改代码后不用重启服务
  4. python怎么读文件内容-Python 文件内容读取
  5. 使用Github搜索开源项目
  6. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...
  7. 【linux】学习笔记
  8. Cypress 等待某个 HTTP put 请求得到 200 状态码后,再执行下一步的操作代码
  9. Redis的常用功能
  10. SQL Server中使用的公共数据类型
  11. 高速通道 > 专有网络对等连接(关闭新购) > VPC互连
  12. Android开发笔记(七十七)图片缓存算法
  13. python web环境傻瓜搭建_Python 环境搭建以及神器推荐,果断收藏!
  14. 半天的成果,已经很快了,还有方案实现过程
  15. matlab利用图像减法实现找茬
  16. 还没有合并再请求pull_代码被revert,你pull了master代码没了咋找回来
  17. 进入大数据时代,目前我国大数据的发展趋势怎么样
  18. 不错的json在线编辑器
  19. 在用户输入手机号或者要求输入纯数字时,输入法自动切换到数字的代码
  20. python导入excel数据到mysql

热门文章

  1. 苹果6手机怎么录屏_苹果手机如何开启录屏功能 苹果手机开启录屏功能方法【详解】...
  2. 解决Arcmap中遥感影像颜色显示异常问题
  3. 9269:Big String超级字符串
  4. Python中嵌套循环练习
  5. 口子窖Q3营收净利双增背后:高档酒占比下降拖累毛利率下滑
  6. 赢在微点答案专区英语_英语的搭讪万能句,还不来学一下? l 从零开始学英语 E0220...
  7. 工地智能安全帽方案/设计案列/APP
  8. ftp 客户端,9款超级好用而且免费的ftp 客户端,你值得拥有
  9. Qt4实现TableView显示表格数据
  10. CF(C. Scoring Subsequences)(div2)