利用原始套接字,为什么接收到的数据是刚刚发出去的那份数据???

newegg2002 2006-05-29 08:46:09
功能:
我用原始套接字,编写了一个简单的通信程序,从Source端发送一条消息到Destination端。
接收数据时采用Select 模式,对套接字设置了如下选项:接收数据超时;也设置了RIO_RCVALL。

问题:
当D端运行
Recv ----这个是我对recvfrom的封装
Send ----这个是我对sendto的封装
Recv ----问题出在这儿!
此时,并不能接收到发送端发送的数据包,相反,其接收到的内容却是前一次Send函数发出的数据包的内容。请问这是为什么?应该如何解决???

另外,在调用WSASocket时,我最后一个参数选为WSA_FLAG_OVERLAPPED,是否有影响?

...全文
320 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
newegg2002 2006-05-29
  • 打赏
  • 举报
回复
我当初也是这么想的。
于是我连着用了两条Recv语句,希望后一句能接收到发送过来的数据,结果出错了,,
真是郁闷啊,,
DeadWolf 2006-05-29
  • 打赏
  • 举报
回复
用原始套接字会收到通过机器的所有数据 当然应该也包括你刚才发送的
我是这么想的
newegg2002 2006-05-29
  • 打赏
  • 举报
回复
谢谢你
那为什么我收到数据总是我刚刚发出的那份数据呢,,这种情况应该怎么解决???
Featured 2006-05-29
  • 打赏
  • 举报
回复
没有影响
Overlapped表示重叠方式,也就是所谓的异步.
就是不需要等本次发完就可以发下次
newegg2002 2006-05-29
  • 打赏
  • 举报
回复
Recv的代码:

BOOL CICMPMessager::RecvDataFrom(UDNP_HEADER& UdnpHeader, sockaddr_in& AddrFrom) {


struct timeval tv;
fd_set readSet;


while (TRUE) {
tv.tv_sec=3;
tv.tv_usec=0;
FD_ZERO(&readSet);
FD_SET(m_SocketBind, &readSet);

int res=select(m_SocketBind+1, &readSet, NULL, NULL, &tv);

if(SOCKET_ERROR==res) {
AfxMessageBox("Error Select!");
CString szTest;
szTest.Format("%d", WSAGetLastError());
AfxMessageBox(szTest);
break;
}

//int nError=WSAGetLastError();
if (FD_ISSET(m_SocketBind, &readSet)) {
memset(m_lpIpHeader, 0, 1024);
memset(&m_ipAddr, 0, sizeof(m_ipAddr));

int nLenSockAddr=sizeof(sockaddr_in);
int nState=recvfrom(m_SocketBind, (char*)m_lpIpHeader, 1024,
NULL, (struct sockaddr*)&m_ipAddr, &nLenSockAddr);

if (SOCKET_ERROR != nState) break;

}

}


//计算IP数据长度

int nLenIPHeader=0;
nLenIPHeader=m_lpIpHeader->nHeadLen*4;

//截取ICMP数据包并检测类型码是否为ICMP_ECHOREPLY
ICMP_HEADER* lpIcmpHeader = (ICMP_HEADER*)((CHAR*)m_lpIpHeader+nLenIPHeader);
if(ICMP_ECHOREPLY != lpIcmpHeader->cType) return FALSE;


//截取自定义数据包并检测标志位是否为":D"
UDNP_HEADER* lpUdnpHeader = (UDNP_HEADER*)((CHAR*)lpIcmpHeader+sizeof(ICMP_HEADER));
CHAR cFMark[2];
strncpy(cFMark, (CHAR*)lpUdnpHeader->FMark, 2);

if(':' != cFMark[0] || 'D' != cFMark[1]) return FALSE;

memcpy((void*)&UdnpHeader, lpUdnpHeader, sizeof(UDNP_HEADER));
memcpy((void*)&AddrFrom, (void*)&m_ipAddr, sizeof(sockaddr_in));
return TRUE;
}
DeadWolf 2006-05-29
  • 打赏
  • 举报
回复
给Recv的代码看看
newegg2002 2006-05-29
  • 打赏
  • 举报
回复
太谢谢你了,,
nuaawenlin(飘人)
DeadWolf

是啊!!我是在本机上实验的,,难道。。。
请说明白一点,,
newegg2002 2006-05-29
  • 打赏
  • 举报
回复
想想也不可能,,因为发送方没出同类似的情况,,
nuaawenlin 2006-05-29
  • 打赏
  • 举报
回复
你的接受端是不是也是你本机器压?
也就是服务器和客户端都在一个机器商?
DeadWolf 2006-05-29
  • 打赏
  • 举报
回复
是不是你封装的包有问题 例如校验和不对等等

所以只有你本机发送的被本机收到了 但是传输过程中被协议栈当作错误包给丢弃了

18,357

社区成员

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

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