2017-07-06 13 views
-2

UDPを介してコンピュータから別のコンピュータにデータを送信しようとしました(最初のコンピュータ:Ubuntu、C++ with Eclipse、Second Computer Windows 10 Matlab 2014b)。 C++コンピュータはサーバとして動作するはずです。 C++からMatlabへのデータ送信はうまくいきますが、逆方向にデータを送信することはできません。私のC++プログラムがrecvfrom()に達するたびに、matlabが何度も何度もデータを送信していても、何もせずにこの時点でアイドル状態になります。私はnetcat経由でubuntuのデータを受け取ろうとしましたが、Matlabでパッケージを送信してもうまくいきました。私もselect()で何かを試しましたが、これはプログラムがselect()に到達してからrecvfromで再びフリーズしたときに10秒待っていました。誰かが私に助けを与えることができれば非常に感謝しています。ソケット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

あなたの答えをありがとう。私はすでに非ブロックモードでソケットを設定しようとしました。そして、帽子の後で私のプログラムはもはや凍結していませんでした。しかし、問題は、私はrecvfrom()はいくつかのデータを取得する必要がありますので、プログラムをさらに進める必要がありますので、私はMatlabを介してデータを送信しているということです。しかし、なぜこれが起こらないのか分かりますか?私が言ったように、私はmatlabを介してデータを送信し、netcatでテストすると、データがC++コンピュータに届いているかどうかは問題ありません。 – Jannik

答えて

0

デバッグモードでプログラムを実行すると、プログラムはrecvfromを渡していますが、送信されたデータは受信されません。たとえ私がwhileループでrecvfromを実行しても、ポートrecvfromにデータを常時送信することは決してパッケージを取得しません。私が聞いて実行しようとする前にそれを(私はusud接続では必要ではないことを知っている)関数は両方とも-1を返します。しかし、なぜ私のソケットがデータを受け取る準備ができていないのかわかりません。おそらくanynoneはこの問題を解決するアイディアを持っていますか?

+0

長い検索の後、私は問題を解決しました。ソケットを縛ることで間違いが起きました。間違い1:sizeof(server)の代わりにsizeof(&server)を使用し、2の場合:-1の代わりにbind ... =!1を間違えます。だから、ソケットをバインドすることは決して成功しませんでしたが、バインダーの頼みのために!= 1プログラムはバインディングが成功したと私に言いました。 – Jannik

関連する問題