繁体   English   中英

C ++ WINSOCK recvfrom没有从网络获取数据

[英]c++ WINSOCK recvfrom no get data from network

我有问题,因为我的服务器无法获取UDP数据。 路由器上的端口被转发,数据收入到本地服务器网络(在嗅探器(3)上可见),但服务器未收到。

服务器和服务器网络屏幕

您会看到1和2个TCP数据包将收入正确地发送给已连接套接字上的服务器。 但是我的客户端然后将UDP数据发送到服务器,并且数据输入到本地服务器网络(请参阅嗅探器在3上检测到它),但是服务器不接收它。

这是客户代码:

struct sockaddr_in si_other;
int s, slen = sizeof(si_other);
char buf[10];
char message[10];
WSADATA wsa;

//Initialise winsock
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
    printf("Failed. Error Code : %d", WSAGetLastError());
    exit(EXIT_FAILURE);
}
printf("Initialised.\n");

//create socket
if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
{
    printf("socket() failed with error code : %d", WSAGetLastError());
    exit(EXIT_FAILURE);
}

//setup address structure
memset((char *)&si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(14996);
si_other.sin_addr.S_un.S_addr = inet_addr(server ip);

memcpy(message, "cokolwiek", 8);

//send the message
if (sendto(s, message, strlen(message), 0, (struct sockaddr *) &si_other, slen) == SOCKET_ERROR)
{
    printf("sendto() failed with error code : %d", WSAGetLastError());
    exit(EXIT_FAILURE);
}

但这不是客户端的问题。 这是服务器代码,但我认为它也是正确的:

SOCKET s;
struct sockaddr_in server, si_other;
int slen, recv_len;
char buf[10];
WSADATA wsa;

slen = sizeof(si_other);

//Initialise winsock
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
{
    printf("Failed. Error Code : %d", WSAGetLastError());
    exit(EXIT_FAILURE);
}
printf("Initialised.\n");

//Create a socket
if ((s = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
{
    printf("Could not create socket : %d", WSAGetLastError());
}
printf("Socket created.\n");

//Prepare the sockaddr_in structure
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port = htons(14996);

//Bind
if (::bind(s, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR)
{
    printf("Bind failed with error code : %d", WSAGetLastError());
    exit(EXIT_FAILURE);
}
puts("Bind done");

//blocking on it, waiting for data
if ((recv_len = recvfrom(s, buf, 10, 0, (struct sockaddr *) &si_other, &slen)) == SOCKET_ERROR)  
{
    printf("recvfrom() failed with error code : %d", WSAGetLastError());
    exit(EXIT_FAILURE);
}

//print details of the client/peer and the data received
printf("Received packet from %s:%d\n", inet_ntoa(si_other.sin_addr), ntohs(si_other.sin_port));
printf("Data: %s\n", buf);

一些说明可能会有所帮助-主服务器循环为select(),当客户端请求订单时,服务器将订单发送回客户端并开始执行命令。

server:
while (1) {
    select()

        if (socket is in FD_SET)
            get data, send it back and handleCommand()
}

handleCommand() {
    tcp data exchange
    wait for udp packet - it fail
}

client:

sendCommand()

//another receiving commands thread
while (recv) {
    handle command
    tcp data exchange 
    send udp data
}

请不要再让我再等一次。 我需要为NAT穿越打孔。 那是什么问题 另一个听众正在获取我的数据? 但是netstat -nop UDP -a没有提供其他正在监听的信息,并且绑定套接字也没有失败。 另一个重要的信息该代码在程序开始时起作用,我的意思是服务器接收数据,但后来没有。

奥基 ,正如ElderBug所说

确定发送数据之前已设置UDP服务器套接字吗? 您的问题不清楚

是的,这是我的错。 几秒钟的时间决定在服务器上设置侦听器之前已在一台计算机上发送数据。 谢谢你的答案。

但是我不完全理解这个问题。 那个数据收入不应该接收缓冲区并等待通过recvfrom函数“抓取”它吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM