数据到达时recvfrom()不起作用

时间:2019-02-21 22:49:43

标签: c linux windows sockets udp

我正在使用不同操作系统之间的套接字:Windows客户端和Linux服务器。 我已经设法在它们之间进行稳定的通信,但是当在另一台设备上运行服务器(具有相同的操作系统并创建相同的服务器可执行文件)时,事实证明服务器的recvfrom()函数不起作用,并且该程序阻止了我。 我试图更改端口:它不起作用 我试图将此代码带到其他设备:它不起作用。 我已经用Wireshark跟踪了网络流量:数据包从客户端完美发送到服务器的IP。发送给客户端的服务器程序包已正确发送。

我不知道什么可能会失败。编译器不会报告任何问题,对于我在其他设备中拥有的应用程序,我也没有更改任何代码,只是我现在发送的结构具有2个参数(int + float),而之前的结构具有3个参数( int + 2float)。

我希望有人能帮助我,非常感谢。

服务器(LINUX)代码:

bzero((char *)&rc_server.dir_serv,sizeof(rc_server.dir_serv));
rc_server.dir_serv.sin_family=AF_INET;
rc_server.dir_serv.sin_addr.s_addr=inet_addr(DIR_UDP_U12);
rc_server.dir_serv.sin_port=htons(PORT_UDP_U12);

if((rc_server.sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
    printf("Servidor:no puedo abrir socket\n\n");
else
    printf("Servidor: Socket creado correctamente\n");

if(bind(rc_server.sockfd,(struct sockaddr *)&rc_server.dir_serv,sizeof(rc_server.dir_serv))<0)
{
    printf("Servidor: no se puede asociar la direccion local. Error en bind()\n\n");
    errorbind=1;
}
else
printf("Servidor: bind realizado correctamente\n");


// Bloqueo en espera del centro remoto
printf("\n\n------Servidor: preparado para recibir datos------\nEjecute aplicación en el cliente.\n\n\n");
i = recvfrom(rc_server.sockfd,(char*)&rc_server.receive_data,sizeof(comm_data_t),0,(struct sockaddr *)&rc_server.dir_cli,&rc_server.long_dir_cli);  // NO_RT!
printf("Valor de retorno de revfrom(): %d\n\n\n", i);    

客户端(WINDOWS)代码:

#if defined WIN32
WSADATA wsaData;
int iResult;
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0)
    printf("error en WSASturtup\n");
else
    printf("Winsock iniciado correctamente\n");
#endif
#if defined(RT)

int n=0;

/* Cliente para la comunicación con el robot */
memset((char *)&client.dir_serv, 0, sizeof(client.dir_serv));

client.dir_serv.sin_family=AF_INET;
client.dir_serv.sin_addr.s_addr=inet_addr(DIR_UDP_U12); 
client.dir_serv.sin_port=htons(PORT_UDP_U12);

if((client.sockfd=socket(AF_INET,SOCK_DGRAM,0))<0)
    printf("Cliente: no puedo abrir socket con el ROBOT");
else
    printf("Socket creado correctamente\n\n\n\n");


/* Envio de señal de comienzo al robot */
n=sendto(client.sockfd, (char *)&client.send_data, sizeof(comm_data_t), 0, (struct sockaddr *)&client.dir_serv, sizeof(client.dir_serv));
if(n<0)
{
    perror("dg_cli: error en el sendto\n");
    printf("n = %d\n\nWSAerror = %d\n\n", n, WSAGetLastError());
}
else
    printf("Primer mensaje enviado\n\n\n");

在客户端应用程序中,我会定期发送数据,不仅是第一个sendto(),还有更多。如我所说,数据已正确发送,但是在服务器上,recvfrom()函数未检测到任何程序包的到达。

再次感谢您的帮助。

0 个答案:

没有答案