recvfrom () не работает при получении данных - PullRequest
0 голосов
/ 22 февраля 2019

Я работаю с сокетами между различными операционными системами: клиент 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 () не обнаруживает прибытие какого-либо пакета.

Еще раз спасибо за вашу помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...