【发布时间】:2017-01-19 18:06:33
【问题描述】:
我正在我的工作站 (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,'\0', 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 时,我得到了与我期望发送的字节数相匹配的 sendto 的适当返回值,但我没有看到我的工作站上的数据(在 9001 上收听)。
我一直在努力反对这一点,但我看不出有什么问题。在修改后的示例中,任何帮助将不胜感激。
更新:我的开发 PC 上的防火墙出现故障。它允许我的 PC 发送的同一端口上的流量返回,但阻止任何其他端口上的流量。解决该问题允许在不更改代码的情况下发送流量。我之前禁用了防火墙,但没有意识到操作系统已将以太网标记为“公共网络”,但仍然启用了防火墙。
【问题讨论】:
-
您如何知道您的接收程序正在运行?您是否尝试过使用wireshark 来查看是什么击中了电线?如果您打印出
sendto()的返回码也会很有帮助,因为很难判断它是否失败。 -
首先要做的是检查绑定并使用 WSAGetLastError。随时检查打印的第二件事,例如:是否收到消息。使用阻塞函数来接收和发送。我曾经做过的最好的事情是我使用 udp 套接字和多线程制作了一个聊天程序
-
你为什么要换
sin_port?它已经包含recvfrom()之后的发送端口号。那是您要回复的端口。删除该行。
标签: c++ sockets udp windows-ce winsock