博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sockaddr和sockaddr_in的区别
阅读量:4656 次
发布时间:2019-06-09

本文共 1339 字,大约阅读时间需要 4 分钟。

在socket编程中我们都会用到bind()函数和connect()函数,其第二个参数都是指向sockaddr类型的指针,其函数声明如下:

int bind(SOCKET s,  const struct sockaddr FAR* name,  int namelen);
参数:

         s             指定将要绑定的套接字。

     name         指向sockaddr结构的指针变量。

     namelen    指定该地址结构的长度。

需要着重说明的是name参数,由于该地址结构是为所有的地址家族准备的,这个结构通常会随所使用的网络协议的不同而不同,但是第一个成员都是占两个字节;sockaddr的结构体如下:

struct sockaddr {    u_short sa_family;      CHAR sa_data[14];   // Up to 14 bytes of direct address.};
在这个结构体中sa_family必须指定为AF_INET,成员sa_data[14]只是起到占位的作用,随不同的协议而发生变化,但是总大小不变,都是16字节

在基于TCP/IP的socket编程过程中,我们可以用sockaddr_in结构体来替换sockaddr,其结构体如下:

struct sockaddr_in {    short    sin_family;  //地址族     2Byte     USHORT   sin_port;    //端口号     2Byte    IN_ADDR  sin_addr;    //IPV4地址   4Byte    CHAR     sin_zero[8]; //起站位作用 8Byte};
IN_ADDR的结构体如下:

typedef struct in_addr {    union     {        struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;        struct { USHORT s_w1,s_w2; } S_un_w;        ULONG S_addr;    } S_un;} IN_ADDR;
可以发现IN_ADDR是实际上是个联合体,大小为4个字节,union类型的字节大小为
成员当中最大的那一个,S_un_b ,S_un_w,S_addr三个成员都是4个字节,因此
IN_ADD大小也就4个字节

在实际编程过程中,我们需要将sockaddr_in指针强制转为化sock_addr类型的指针,如下所示:

SOCKADDR_IN addrSrv;    addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);    addrSrv.sin_family = AF_INET;    addrSrv.sin_port = htons(6000);    //绑定套接字    bind(socketSrv,(SOCKADDR*)&addrSrv, sizeof(SOCKADDR));

转载于:https://www.cnblogs.com/jinxiang1224/p/8468322.html

你可能感兴趣的文章
51-os库函数之应用(1)
查看>>
android应用安全——代码安全(android代码混淆)
查看>>
web页面增、删、改
查看>>
第十四周学习进度表
查看>>
web网站性能优化整理
查看>>
年度最佳电视剧
查看>>
C#实现调用默认浏览器打开多个网页
查看>>
qt的登录设置(转)
查看>>
iOS ADBannerView的简单使用
查看>>
有关std::map和std::vector的使用
查看>>
差点要重新装机,驱动问题解决一例
查看>>
ThinkPHP3.1 常量参考
查看>>
Java网页数据采集器[中篇-数据存储]【转载】
查看>>
送你一颗子弹
查看>>
AOP JoinPoint
查看>>
在IBM学到的东西,到底对我的程序生涯产生了多大的影响
查看>>
【Linux】Linux常用命令
查看>>
python3 练习题100例 (十一)
查看>>
python3 练习题100例 (十三)
查看>>
bootstrap-treeview 树形菜单带复选框以及级联选择
查看>>