C++;UDP发送失败,需要睡眠 我有一个基于WSA套接字的UDP客户端C++代码——运行良好。这段代码最初是用VS6编写的,我最近在VS2010中为64位环境重新编译了它,只做了很少的调整

C++;UDP发送失败,需要睡眠 我有一个基于WSA套接字的UDP客户端C++代码——运行良好。这段代码最初是用VS6编写的,我最近在VS2010中为64位环境重新编译了它,只做了很少的调整,c++,udp,sendto,C++,Udp,Sendto,现在,如果sendto()之后和closesocket()之前没有Sleep(..)或任何等效延迟,sendto()将无法发送内容。“Fails”表示sendto()返回了适当数量的数据,但我在网络上看不到任何消息(我使用wireshark进行了检查) 这是我的代码: void CTest::SendHello() { SOCKET sSocket; sSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); struct sockadd

现在,如果sendto()之后和closesocket()之前没有Sleep(..)或任何等效延迟,sendto()将无法发送内容。“Fails”表示sendto()返回了适当数量的数据,但我在网络上看不到任何消息(我使用wireshark进行了检查)

这是我的代码:

void CTest::SendHello()
{
  SOCKET sSocket;
  sSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

  struct sockaddr_in addr;
  addr.sin_family       = AF_INET;
  addr.sin_addr.s_addr  = inet_addr(m_strDstIpAddr);
  addr.sin_port         = htons(m_nTxPort);

  int nMsgLen = 8;
  char pTxBuffer[8];
  *((DWORD*) &pTxBuffer[ 0]) = 0x11223344;
  *((DWORD*) &pTxBuffer[ 4]) = 0;

  int nSent = sendto(sSocket, pTxBuffer, nMsgLen, 0, (struct sockaddr *) &addr, sizeof(addr));
  Sleep(10);   // <- this seems to be necessary

  if (nSent != nMsgLen)
  {
     CString s = "error sending HELO\n";
     AfxMessageBox(s);
  } 
  closesocket(sSocket);
void CTest::sendhhello()
{
插座盒;
sSocket=插座(AF_INET、SOCK_DGRAM、IPPROTO_UDP);
地址中的结构sockaddr\u;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr(m_strDstIpAddr);
地址sin\u端口=htons(m\u nTxPort);
int nMsgLen=8;
char-pTxBuffer[8];
*((DWORD*)&pTxBuffer[0])=0x11223344;
*((DWORD*)&pTxBuffer[4])=0;
int nSent=sendto(sSocket,pTxBuffer,nMsgLen,0,(struct sockaddr*)和addr,sizeof(addr));

睡眠(10);//使用UDP,发送方和接收方之间没有数据排序,使用UDP数据报套接字发送的数据不保证到达。在您的情况下,所有的睡眠实际上都为数据到达另一端提供了足够的时间。如果您要确认接收和错误检查,则可以编写方案事实上,你可以完全关闭服务器,即使没有人监听,你的客户端也会毫无错误地发出UDP数据包


要确保连接,请查看connect()。没有什么可以阻止将connect与UDP一起使用,然后可以使用send()recv()。

如何判断它没有发送任何内容?这两个
*((DWORD*)&pTxBuffer[0])=0x11223344;
行是有创意的。您可能需要使用
char pTxBuffer[8]={0x44,0x33,0x22,0x11};
同样的效果。@UlrichEckhardt,问题是Wireshark什么也看不到。Wireshark…是的,但是在哪里?在目标机器上?如果是这样,那可能会误导,因为UDP在不可靠的情况下。唯一应该始终起作用的是,在空闲网络接口上发送数据包显示为传出数据包。也就是说,我会尝试在套接字上调用
shutdown()
。这应该不是必需的,但出于好奇它是否会改变任何东西。此外,我会尝试创建一个惯用的最小示例,特别是没有MFC。UDP是无连接且不可靠的,那么
connect()应该做什么呢
除了设置一个粘性目标地址之外,还有什么其他方法吗?我没有尝试过,但老实说,你的建议对我来说没有意义。另外,如果你阅读了文档,你应该会发现
sendto()
应该是同步工作的,所以你以后所做的任何事情都不会改变数据包被发送的事实(是否到达是另一个问题)。说UDP不可靠是愚蠢的(尽管技术上是正确的)。UDP的可靠性不亚于TCP,因为它们都使用相同的传输。唯一的区别是TCP确认数据包并避免拥塞。除了在Wifi或非常糟糕的internet路由上,不存在以下情况:“神奇地消失”数据报,至少不在可测量的范围内。UDP不可靠的第一个来源是接收缓冲区满时数据报被丢弃。这里不是这种情况(发送一个数据报)。好吧,TCP可靠地传输数据,或者明显地失败。UDP没有这样的功能。我不认为这种区别很愚蠢。问题是我们只了解了
Test::sendholl()
它只是向服务器和端口发送UDP数据包,无法判断服务器是否在响应。其次,由于这是对64位的重新编译,问题可能完全在于其他地方。最后,关于如何测试
sendto
是否在
等待
的情况下工作的问题,tcpdump可以监控流量将客户端保留为类似于
tcpdump-i eth0-c[count]-w[filename]主机客户端的内容将捕获到与客户端之间的所有通信量。然后只需在wireshark中打开filename(您也可以在wireshark中设置选项)