C++ Winsock UDP sendto 成功但我没有看到正在发送的数据
C++ Winsock UDP sendto succeeds but I don't see the data being sent
我正在通过我的工作站 (192.168.0.1) 和我的 WinCE6 设备 (192.168.0.100) 之间的以太网接口使用 UDP 套接字。
我可以从我的工作站向我的 WinCE 设备发送 UDP 数据包,我在其中设置了接收套接字并在端口 9002 上正确接收数据;然后设备将数据正确地回显到我的工作站。
我希望我的设备在特定端口上响应我的工作站:9001。
这是服务器 运行 进入我的设备,它与 this 相同,但我修改了绑定到特定接口地址的套接字,并更改了 PORT
定义:
#define BUFLEN 512 //Max length of buffer
#define PORT 9002 //The port on which to listen for incoming data
void test_udp( void )
{
SOCKET s;
struct sockaddr_in server, si_other;
int slen , recv_len;
char buf[BUFLEN];
WSADATA wsa;
slen = sizeof(si_other) ;
//Initialise winsock
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
return;
}
//Create a socket
if((s = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
{
printf( "Could not create socket : %d" , WSAGetLastError());
}
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl( 0xC0A80064 );
server.sin_port = htons( PORT );
//Bind
if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
{
return;
}
//keep listening for data
while(1)
{
//clear the buffer by filling null, it might have previously received data
memset(buf,'[=10=]', BUFLEN);
//try to receive some data, this is a blocking call
if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) == SOCKET_ERROR)
{
return;
}
// *** CHANGE THE SEND PORT
si_other.sin_port = htons( 9001 );
//now reply the client with the same data
if (sendto(s, buf, recv_len, 0, (struct sockaddr*) &si_other, slen) == SOCKET_ERROR)
{
return;
}
}
closesocket(s);
WSACleanup();
return;
}
当我在 // *** CHANGE THE SEND PORT
注释下方添加行以尝试将数据发送回端口 9001 时,我得到了与我希望已发送的字节数,但我没有看到工作站上的数据(监听 9001)。
我一直在苦苦思索这个问题,我看不出有什么不妥。在修改后的例子中,任何帮助将不胜感激。
更新:我的开发 PC 上的防火墙有问题。它允许流量返回到我的 PC 发送的同一端口,但阻止任何其他端口上的流量。解决该问题允许在不更改代码的情况下发送流量。我之前禁用了防火墙,但没有意识到 OS 将以太网标记为 "public network",它仍然启用了防火墙。
如果如您所说,您没有从 sendto 获得 SOCKET_ERROR 而您看到的是适当的 return 值,这意味着您的 OS 能够找到通往目标 IP 的路由,并且能够缓冲您的发送请求。
要更改发送端口,如果您想回答与接收数据的端口不同的端口,没关系,但请注意,这不是典型情况; si_other 结构实际上将包含 recvfrom 之后的源地址,因此也包含源端口。 因此请保持您设备端的代码不变。
如果您可能没有看到数据流向您的工作站,在作为您的开发环境的简单网络上下文中,问题出在工作站上:它没有接收数据。
我同意@Daniel 的观点,您必须使用 WireShark 进行调查以查看数据包发生了什么。
希望对您有所帮助
我正在通过我的工作站 (192.168.0.1) 和我的 WinCE6 设备 (192.168.0.100) 之间的以太网接口使用 UDP 套接字。
我可以从我的工作站向我的 WinCE 设备发送 UDP 数据包,我在其中设置了接收套接字并在端口 9002 上正确接收数据;然后设备将数据正确地回显到我的工作站。
我希望我的设备在特定端口上响应我的工作站:9001。
这是服务器 运行 进入我的设备,它与 this 相同,但我修改了绑定到特定接口地址的套接字,并更改了 PORT
定义:
#define BUFLEN 512 //Max length of buffer
#define PORT 9002 //The port on which to listen for incoming data
void test_udp( void )
{
SOCKET s;
struct sockaddr_in server, si_other;
int slen , recv_len;
char buf[BUFLEN];
WSADATA wsa;
slen = sizeof(si_other) ;
//Initialise winsock
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
return;
}
//Create a socket
if((s = socket(AF_INET , SOCK_DGRAM , 0 )) == INVALID_SOCKET)
{
printf( "Could not create socket : %d" , WSAGetLastError());
}
//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = htonl( 0xC0A80064 );
server.sin_port = htons( PORT );
//Bind
if( bind(s ,(struct sockaddr *)&server , sizeof(server)) == SOCKET_ERROR)
{
return;
}
//keep listening for data
while(1)
{
//clear the buffer by filling null, it might have previously received data
memset(buf,'[=10=]', BUFLEN);
//try to receive some data, this is a blocking call
if ((recv_len = recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen)) == SOCKET_ERROR)
{
return;
}
// *** CHANGE THE SEND PORT
si_other.sin_port = htons( 9001 );
//now reply the client with the same data
if (sendto(s, buf, recv_len, 0, (struct sockaddr*) &si_other, slen) == SOCKET_ERROR)
{
return;
}
}
closesocket(s);
WSACleanup();
return;
}
当我在 // *** CHANGE THE SEND PORT
注释下方添加行以尝试将数据发送回端口 9001 时,我得到了与我希望已发送的字节数,但我没有看到工作站上的数据(监听 9001)。
我一直在苦苦思索这个问题,我看不出有什么不妥。在修改后的例子中,任何帮助将不胜感激。
更新:我的开发 PC 上的防火墙有问题。它允许流量返回到我的 PC 发送的同一端口,但阻止任何其他端口上的流量。解决该问题允许在不更改代码的情况下发送流量。我之前禁用了防火墙,但没有意识到 OS 将以太网标记为 "public network",它仍然启用了防火墙。
如果如您所说,您没有从 sendto 获得 SOCKET_ERROR 而您看到的是适当的 return 值,这意味着您的 OS 能够找到通往目标 IP 的路由,并且能够缓冲您的发送请求。
要更改发送端口,如果您想回答与接收数据的端口不同的端口,没关系,但请注意,这不是典型情况; si_other 结构实际上将包含 recvfrom 之后的源地址,因此也包含源端口。 因此请保持您设备端的代码不变。
如果您可能没有看到数据流向您的工作站,在作为您的开发环境的简单网络上下文中,问题出在工作站上:它没有接收数据。
我同意@Daniel 的观点,您必须使用 WireShark 进行调查以查看数据包发生了什么。
希望对您有所帮助