我正在使用不同操作系统之间的套接字: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()函数未检测到任何程序包的到达。
再次感谢您的帮助。