+ -
当前位置:首页 → 问答吧 → 关于socket的结构体地址的疑问

关于socket的结构体地址的疑问

时间:2011-12-07

来源:互联网

大家好 我最近在学习mfc的socket编程
有个疑问
我用的是tcp/ip协议
前面定义了SOCKADDR_IN结构体存储地址
在使用 bind() accept() 和recvfrom() 这三个函数时都需要将SOCKADDR_IN 强制转换成SOCKADDR* 
 
我的问题是 在上面三个函数中都要求给出 结构体长度 sizeof(SOCKADDR) 但是我理解是 虽然把指针定义为SOCKADDR类型

但是使用时还是SOCKADDR_IN的结构体 所以我都用sizeof(SOCKADDR_IN) 不知我理解的对不对 
 
先谢谢大家了!!

作者: CDERFV   发布时间: 2011-12-07

你可以查下MSDN,你会发现这两个结构体的长度是一样的
The Microsoft TCP/IP Sockets Developer's Kit only supports the Internet address domains. To actually fill in values for each part of an address, you use the SOCKADDR_IN data structure, which is specifically for this address format. The SOCKADDR and the SOCKADDR_IN data structures are the same size. You simply cast to switch between the two structure types. 

作者: wutaozhao   发布时间: 2011-12-07

引用楼主 cderfv 的回复:
大家好 我最近在学习mfc的socket编程
有个疑问
我用的是tcp/ip协议
前面定义了SOCKADDR_IN结构体存储地址
在使用 bind() accept() 和recvfrom() 这三个函数时都需要将SOCKADDR_IN 强制转换成SOCKADDR*

我的问题是 在上面三个函数中都要求给出 结构体长度 sizeof(SOCKADDR) 但是我理解是 虽然把指针定义……

bind() accept() 和recvfrom() 函数使用的是SOCKADDR类型的变量,所以应该用sizeof(SOCKADDR),
我们传递的首地址是SOCKADDR_IN类型变量的首地址,再加上长度sizeof(SOCKADDR),函数内部就当做SOCKADDR类型使用,这个时候我们只要保证(sizeof(SOCKADDR)《=sizeof(SOCKADDR_IN))就行了

作者: zhaoze87   发布时间: 2011-12-07

引用 1 楼 wutaozhao 的回复:
你可以查下MSDN,你会发现这两个结构体的长度是一样的
The Microsoft TCP/IP Sockets Developer's Kit only supports the Internet address domains. To actually fill in values for each part of an address, you use the SOCKADDR_IN da……


你好 我看了定义 这两个都是结构体SOCKADDR_IN 的长度却是比SOCKADDR大 前者有4个成员 后者有其中的2个 我不确定俩个结构体一样的?

作者: CDERFV   发布时间: 2011-12-07

引用 2 楼 zhaoze87 的回复:
引用楼主 cderfv 的回复:
大家好 我最近在学习mfc的socket编程
有个疑问
我用的是tcp/ip协议
前面定义了SOCKADDR_IN结构体存储地址
在使用 bind() accept() 和recvfrom() 这三个函数时都需要将SOCKADDR_IN 强制转换成SOCKADDR*

我的问题是 在上面三个函数中都要求给出 结构体长度 sizeof(SOCKADDR……


你好 我刚又看了一下书 上面说用这个参数指定结构体的长度 那么必须是你实际的结构体 
(sizeof(SOCKADDR)《=sizeof(SOCKADDR_IN))这个是什么意思 我比较笨没理解 呵呵

作者: CDERFV   发布时间: 2011-12-07