2017-07-06 117 views
-2

我尝试通过UDP从计算机发送数据到另一台计算机(第一台计算机:Ubuntu,C++与Eclipse,第二台计算机Windows 10 Matlab 2014b)。 C++计算机应该作为服务器工作。从C++发送数据到Matlab工作正常,但我不能以相反的方向发送数据。每当我的C++程序到达recvfrom()时,即使matlab一遍又一遍地发送数据,它将在此时闲置而不再执行任何操作。我尝试通过netcat在ubuntu上接收数据,同时发送包与Matlab,并且工作正常。即使我用select()尝试了一些东西,但是这只会导致在程序到达select()时等待10s,然后再次在recvfrom处冻结。如果有人能给我一些帮助,我将非常感激。套接字UDP程序在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; 
+0

192.168.56.101,是unix盒子还是matlab盒子? – pm100

+0

如果您不希望recvfrom()阻塞,直到收到一些数据,那么您需要将套接字设置为非阻塞模式。 (在这个网站的搜索框中搜索非阻塞,你会看到很多关于如何做到这一点的问题和答案)。 –

+0

感谢您的回答。我已经尝试将套接字设置为非阻塞模式,然后我的程序不再冻结。但问题是我通过Matlab发送数据,所以recvfrom()应该得到一些数据,然后程序应该走得更远。但你能看出为什么这不会发生?正如我所说,当我通过matlab发送数据并用netcat测试数据是否到达C++计算机时,一切都很好。 – Jannik

回答

0

在调试模式下运行程序后突然程序传递recvfrom,但没有收到发送的数据。即使我在while循环中运行recvfrom并不断发送数据到端口recvfrom,永远不会获得包。如果我尝试在它之前运行listen并接受它(我知道这不是udp连接所必需的),那么这两个函数都会返回-1。但我不明白为什么我的Socket没有准备好接收数据。也许anynone有一个想法来解决这个问题?

+0

经过漫长的搜索,我解决了这个问题。通过绑定套接字有错误。错误1:使用sizeof(&server)而不是sizeof(server),错误2:如果bind ... =!1而不是-1。所以绑定套接字永远不会成功,但是因为要求绑定是=!1,程序告诉我绑定成功,而不是。 – Jannik

相关问题