UDP中的recvfrom没有得到任何东西

Posted

技术标签:

【中文标题】UDP中的recvfrom没有得到任何东西【英文标题】:recvfrom in UDP not getting anything 【发布时间】:2017-10-25 21:09:32 【问题描述】:

我正在尝试在 UDP 套接字上接收数据,但我找不到接收任何内容的方法。

我可以通过wireshark看到数据实际上是传到计算机的,但是recvfrom总是超时。

涉及的代码非常简单:

mUDPSocket = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
if( mUDPSocket == INVALID_SOCKET )
    return 1;

uint32_t aTimeout = 5000;
const int lResult = setsockopt( mUDPSocket, SOL_SOCKET, SO_RCVTIMEO, ( char * )&aTimeout, sizeof( aTimeout ) );

if( SOCKET_ERROR == lResult )
    return 1;

struct sockaddr_in addr = ;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl( INADDR_ANY ); //also tried with my local ip
addr.sin_port = htons( 48640 );

if( bind( mUDPSocket, ( const sockaddr * )&addr, sizeof( addr ) ) < 0 )
    return 1;

稍后尝试接收数据时

if(recvfrom( mUDPSocket, ( char * )aData, aSize, 0, NULL, 0 )<0) //function return -1
    std::cout << WSAGetLastError() << std::endl; //10060

我正在尝试做一些基本的事情,所以我想我错过了一些简单的事情。

编辑:数据包每秒发送几次,超时时间为 5 秒,所以我应该在真正超时之前收到它

我已经附上了wireshark的截图

【问题讨论】:

你得到了WSAETIMEDOUT。你自己在套接字上设置了一些超时aTimeout,它在你得到任何数据报之前就过期了 recvfrom() 退出时,lResult 的实际值是多少? LAST_ERROR 是如何设置的?请提供minimal reproducible example,以及显示recvfrom() 未收到的数据报详细信息的实际Wireshark 捕获(或其屏幕截图)。仅仅因为一个数据包到达机器并不能保证它被路由到一个活动的套接字。 调用WSALastError() 无效除非错误。有吗? 为澄清而编辑的帖子 【参考方案1】:

我可以看到代码超时的唯一方法是:

aTimeout 过去之前没有到达数据报(aTimeout 的实际值是多少?)

数据报未使用 IPv4

数据报未发送到机器上的 IP,或未发送到端口 48640

数据报被阻止,例如被防火墙阻止。

【讨论】:

确实是防火墙,但是如果防火墙阻止了,为什么wireshark能够看到传入的数据呢?为什么 Windows 防火墙会阻止我正在监听的端口上的数据?同一个程序已经使用其他端口在 TCP 和 UDP 中与同一个设备进行通信。在最后一个端口上,我只是试图接收数据,而 windows 防火墙只阻止这些数据 对于windows防火墙:我不得不删除我的程序的规则,所以窗口会再次出现,所以我可以允许流量。 @DavidLevy Wireshark 捕获的级别低于防火墙运行的级别,因此它首先看到入站数据包。仅仅因为你打开了一个端口并不意味着防火墙仍然不能阻止它上面的数据,因为它在你和硬件之间运行。由于 UDP 是无连接的,防火墙通常会阻止到端口的入站 UDP 数据包,除非首先从同一端口发送出站数据包,或者您告诉防火墙允许端口上的入站流量

以上是关于UDP中的recvfrom没有得到任何东西的主要内容,如果未能解决你的问题,请参考以下文章

在 UDP 套接字上使用 sendto()/recvfrom() 而不是 connect()/send()/recv() 的目的是啥?

recv,recvfrom,send,sendto

recvfrom()的一次调用只能返回一个UDP包。此种说法正确吗?

recvfrom 没有收到来自客户端的任何内容,但客户端正在发送信息

【奇】udp的recvfrom

多线程的UDP聊天器