CAsyncSocket::Accept和IP的问题

yongdu 2000-05-23 06:17:00
virtual BOOL Accept( CAsyncSocket& rConnectedSocket,
SOCKADDR* lpSockAddr = NULL, int* lpSockAddrLen = NULL );
它的第二、三个参数是包含连接上Socket的IP地址,(问1)我不明SOCKADDR中
struct sockaddr {
unsigned short sa_family;
char sa_data[14];
};
这两个成员的意思和作用,我就用
SOCKADDR mmm;
int l=sizeof(mmm);
m_pSocket->Accept(*pSocket,&mmm,&l)
想来看mmm和l的返回值,我就设置了断点,(问2)但我在DEBUG状态下为什么
不能watch到mmm和l的值?
(问3)
SOCKADDR_IN structure:
struct sockaddr_in{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};解释一下各成员的意义,SOCKADDR_IN和SOCKADDR有何区别?



...全文
318 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
puzzle 2000-05-26
  • 打赏
  • 举报
回复
我想既然你是开发WINSOCK程序,那现在只需要考虑WINSOCK所支持的结构。
sin_family: 该字段只能置为AF_INET;
sin_port: 该字段为应用程序必须连接的端口号
sin_addr: 该字段为主机IP地址
sin_zero: 保留
上面mach所说的WINSOCK唯一支持的协议族下,使用的地址结构为SOCKADDR_IN.
我以为此时的SOCKADDR.SA_DATA结构本身并不提供你所希望的内容。所以第二个
问题可以回避。如果你需要诸如主机地址之类的数据,是否可以这样做:
sockaddr mmm;
int l = sizeof(mmm);
if(m_pSocket->Accept(*pSocket, &mmm, &l))
{
AfxMessageBox((CString)(sockaddr_in)&mmm->sin_addr);
}
至于无对话框弹出,我想可能是因为参数的数据类型有误的缘故吧

随便说说,自己没有试......
yongdu 2000-05-26
  • 打赏
  • 举报
回复
谢谢各位的解答,我还有一问:
我用:
SOCKADDR mmm;
int l=sizeof(mmm);
if (m_pSocket->Accept(*pSocket,&mmm,&l))
{
AfxMessageBox(mmm.sa_data);
......
为何没有弹出对话框,
yongdu 2000-05-26
  • 打赏
  • 举报
回复
谢谢各位
mach 2000-05-26
  • 打赏
  • 举报
回复
要得到对方ip,你可以用:
sockaddr_in mmm;
int l = sizeof(mmm);
if(m_pSocket->Accept(*pSocket, (sockaddr_in*)&mmm, &l))
{
....
}
通过mmm.sin_addr.s_addr得到ip
或通过
CString ip;
UINT iPort;
m_pSocket->GetPeerName(ip,iPort);
得到对方ip;
至于不谈出对话框,是因为你用CAsyncSocket,它是异步的,如果你调用Accept时没有客户端的连接请求,他会立即返回0的,这时用GetLastError,将返回WSAEWOULDBLOCK。
lara 2000-05-25
  • 打赏
  • 举报
回复
CString straddr;
straddr=inet_ntoa(((SOCKADDR_IN *)lpSockAddr)->sin_addr);
straddr就是一个"x.x.x.x"型式的子符串
yongdu 2000-05-25
  • 打赏
  • 举报
回复
mach:
我现在要想知道正在连接的计算机的IP地址,它是在SOCKADDR* lpSockAddr 中吗我该怎
么去访问和使用它?
mach 2000-05-23
  • 打赏
  • 举报
回复
socket最初设计为不止可以用来在网上通信,也可以在本机上通过命名管道通信,所以用sin_family来表示协议族,除了AF_INET,也可以是别的值.
由于上述原因,不同的协议族,需要用不同的数据结构来表示地址,为了这个目的,设计了一个通用的结构就是SOCKARRD,他就像一个抽象基类,各个协议族从他派生出自己的地址结构,如SOCKADDR_IN.
sockaddr_in::sin_zero[8]的作用就是使sizeof(sockaddr_in)==sizeof(sockaddr)
而sockaddr::sa_data[14]正好是BSD unix中的文件名的最大长度(给AF_UNIX用的).


Elephant 2000-05-23
  • 打赏
  • 举报
回复
关注

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧