散分了:IPV6下发送UDP报文的一个问题,请问各位大牛,为何recvfrom在XP环境下总是返回10014,而只能用recv(),可是用recv函数如何获知报文源地址,代码如下:

码农wuhb 2007-10-24 07:25:43
char sBuf[128];
sockaddr_in6 sa;
in6_addr sa;
int iAddrLen=sizeof( sa );//这样只有24位长,不够长度。所以要改为32,实际收到是28:(
int a=sizeof(sockaddr);

ZeroMemory( &sa, sizeof( sa ) );
memset(&sBuf,0,sizeof(sBuf));

//int iLen = recvfrom(s_send, sBuf, sizeof(sBuf),(struct sockaddr*)&sa, &iAddrLen );//recvfrom在winXP下也不正常而recv就可以,但recv如何获知报文源地址呢?

int iLen = recv(s_send, sBuf, sizeof(sBuf),0);
...全文
598 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
simonlx 2008-03-11
  • 打赏
  • 举报
回复
mark
码农wuhb 2007-10-26
  • 打赏
  • 举报
回复
TO Fox1999:
还是不太直观,能告诉我如何修改吗?谢谢:
DWORD CALLBACK RecvProc(void *pWnd)
{
CIPv6Dlg &dlg = *(CIPv6Dlg *)pWnd;

int RecvLen; //接受字节数
char RecvBuff[BuffSize+1]; //接受缓冲区
sockaddr_in6 sa; //IPv6地址结构
int AddrLen; //地址长度
CString strMessage;

sockaddr_in6 recvAddr;
ZeroMemory(&recvAddr,sizeof(recvAddr));

int len = sizeof(recvAddr);
AddrLen = sizeof (sa);
ZeroMemory(&sa, sizeof(sa));

while(Flag)
{
RecvLen = recvfrom(s, RecvBuff,sizeof(RecvBuff),0,(SOCKADDR*)&recvAddr,&len);
//RecvLen = recv(s,RecvBuff,BuffSize,0); //由于recvfrom不正常,这里改用recv
int nError = WSAGetLastError();
if (RecvLen>0)
{
int n = getpeername(s, (SOCKADDR*)&recvAddr,&len);
RecvBuff[RecvLen] = '\0';
strMessage.Format("Received:%s",RecvBuff);
dlg.m_ctlMessageList.SendMessage(LB_INSERTSTRING,-1,WPARAM((LPCTSTR)strMessage));
}

}
return 1;
}
码农wuhb 2007-10-25
  • 打赏
  • 举报
回复

我们原来代码不是用的CAsynSocket这个类实现的,而是用Windows API来实现的,现在要支持IPV6,在vckbase上下了个IPV6 UDP报文发送的例子,如上 recvfrom(s_send, sBuf, sizeof(sBuf),(struct sockaddr*)&sa, &iAddrLen );总是失败,而只好改用recv(s_send, sBuf, sizeof(sBuf),0);
可是我还是想知道如何才能得知报文源地址.而用SendToEx也用过,每次也是不成功的,error C2039: 'SendToEx' : is not a member of 'CAsyncSocket'.
fox1999 2007-10-25
  • 打赏
  • 举报
回复
SOCKADDRIN
有一個 sin_family 寫成 AF_INET6, 然後 IP 地址的域有些不同。
在 IPV4 下有幾個 zero ,IPV6 要占用幾個。
AhJo 2007-10-25
  • 打赏
  • 举报
回复
不懂
帮顶
dyw 2007-10-24
  • 打赏
  • 举报
回复
看这个MFC函数是怎么实现的,找找源代码:
CAsyncSocket::SendToEx
Call this member function to send data to a specific destination (handles IPv6 addresses).

http://msdn2.microsoft.com/en-us/library/5st06kh6(VS.80).aspx
ReverseEngineering 2007-10-24
  • 打赏
  • 举报
回复
获取源地址应该有其他的函数吧。查查看。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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