C++ UDP中的recvfrom未获取任何内容

C++ UDP中的recvfrom未获取任何内容,c++,windows,sockets,C++,Windows,Sockets,我试图通过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( mU

我试图通过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;
mUDPSocket=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
if(mUDPSocket==无效的_套接字)
返回1;
uint32_t aTimeout=5000;
const int lResult=setsockopt(mUDPSocket,SOL_SOCKET,SO_RCVTIMEO,(char*)&aTimeout,sizeof(aTimeout));
if(套接字错误==lResult)
返回1;
addr={}中的结构sockaddr_;
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=htonl(INADDR_ANY)//还尝试了我的本地ip
地址sin_端口=htons(48640);
如果(绑定(mUDPSocket,(常量sockaddr*)和地址,大小(地址))<0
返回1;
以及稍后尝试接收数据时

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

if(recvfrom(mUDPSocket,(char*)aData,aSize,0,NULL,0)我看到代码超时的唯一方法是:

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

  • 数据报未使用IPv4

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

  • 数据报正在被阻止,例如被防火墙阻止


您得到了
WSAETIMEDOUT
。您自己在套接字上设置了一些超时
aTimeout
,并且在您得到任何数据报之前它就已经过期了
lResult的实际值是
recvfrom()
退出时的值?如何设置
最后一个错误
?请提供一个,以及实际的Wireshark捕获(或它的屏幕截图)显示
recvfrom()
未接收的数据报的详细信息。仅因为数据包到达计算机,并不保证它被路由到活动套接字。调用
wsalasor()无效
除非有错误。是否有?为澄清而进行了后期编辑它确实是防火墙,但如果防火墙阻止,为什么wireshark能够看到传入的数据?为什么windows防火墙阻止im侦听的端口上的数据?同一程序已经在TCP和UDP中使用其他端口与同一设备通信。在这s的最后一个端口,我只是试图接收数据,而windows防火墙只会为windows防火墙阻止此数据:我必须删除我程序的规则,这样windows弹出窗口会再次出现,这样我就可以允许trafic了。@DavidLevy Wireshark捕获的级别低于防火墙的操作级别,因此它会首先看到入站数据包。这是因为您打开一个端口并不意味着防火墙仍然无法阻止该端口上的数据,因为它在您和硬件之间的某个级别上运行。由于UDP连接较少,防火墙通常会阻止到某个端口的入站UDP数据包,除非先从同一端口发送出站数据包,或者您通知防火墙允许该端口上的入站流量