Я пытаюсь отправить данные через UDP с компьютера на другой (первый компьютер: Ubuntu, C ++ с Eclipse, второй компьютер Windows 10 Matlab 2014b). Компьютер C ++ должен работать как сервер. Отправка данных из C ++ в Matlab работает нормально, но я не могу отправлять данные в обратном направлении. Каждый раз, когда моя программа на C ++ достигает recvfrom (), в этот момент она бездействует, ничего не делая, даже если matlab отправляет данные снова и снова. Я пытался получать данные по Ubuntu через Netcat при отправке пакетов с Matlab, и это тоже хорошо работает. Даже я пытался что-то с select (), но это только привело к ожиданию 10 секунд, когда программа достигает select (), а затем снова зависает в recvfrom. Буду очень признателен, если кто-нибудь сможет мне помочь.
int Socket=socket(AF_INET, SOCK_DGRAM,0);
/*FD_ZERO(&SockSet);
FD_SET(Socket,&SockSet);
sTimeval.tv_sec=0.1;
sTimeval.tv_usec=0;
int status=select(Socket+1,&SockSet,(fd_set*)NULL,(fd_set *)NULL,&sTimeval);
cout<<status<<endl;*/
if(Socket!=-1)
cout<<"Socket created"<<endl;
else
cout<<"Socket not created"<<endl;
unsigned short port=4012;
struct in_addr serverIP;
//(void)inet_pton(AF_INET,"192.168.56.100", &clientIP);
(void)inet_pton(AF_INET,"192.168.56.101", &serverIP);
struct sockaddr_in server;
memset(&server,0, sizeof(server));
server.sin_family=AF_INET;
server.sin_addr=serverIP;
server.sin_port=htons(port);if(bind(Socket,(struct sockaddr*)&server, sizeof(&server))!=1)
cout<<"Binding successful"<<endl;
else
cout<<"Binding failed";struct sockaddr client;
memset(&client, 0, sizeof(client));
socklen_t clientlen=0;
struct sockaddr_in* client_in;
memset(&client_in,0,sizeof(client_in));cout<<"warten vor recv"<<endl;
ssize_t bytesread=recvfrom(Socket, &msg, sizeof(msg), 0, &client,&clientlen);
cout<<(int)bytesread<<endl;
cout<<msg<<endl;client_in=(struct sockaddr_in*)&client;
char* client_adr=inet_ntoa(client_in->sin_addr);
printf("%s Port%d\n", client_adr, ntohs(client_in->sin_port));if (bytesread == -1) {
cerr << "Fehler beim empfangen" << endl;
int status = close(Socket);
if (status == 0)
cout << "Socket closed" << endl;
else if (status == -1)
cout << "Socket not closed" << endl;
return (1);
}//Wenn Infos ueber Client nicht schon vorher aus recvfrom()
/*struct in_addr clientIP;
(void)inet_pton(AF_INET,"192.168.2.102", &clientIP);
struct sockaddr_in client;
memset(&client,0, sizeof(client));
client.sin_family=AF_INET;
client.sin_addr=clientIP;
client.sin_port=htons(portwindows);*/char msg2[]="12345";
ssize_t bytessent=sendto(Socket,msg2,strlen(msg2),0,(struct sockaddr*)&client,sizeof(client));
cout<<(int)bytessent<< " bytes were sent"<<endl;int status=close(Socket);
if(status==0)
cout<<"Socket closed"<<endl;
else if(status==-1)
cout<<"Socket not closed"<<endl;
После запуска программы в режиме отладки программа внезапно передает recvfrom, но без получения отправленных данных. Даже если я запускаю recvfrom в цикле while и постоянно отправляю данные в порт, recvfrom никогда не получает пакет. Если я пытаюсь запустить listen и accept до этого (обычно я знаю, что это не нужно при соединении udp), обе функции возвращают -1. Но я не могу понять, почему мой сокет не готов к приему данных. Может быть, у кого-нибудь есть идея решить эту проблему?
Других решений пока нет …