套接字UDP-程序在recvfrom处停止 我尝试通过UDP从计算机发送数据到另一台计算机(第一台计算机:Ubuntu,C++与伊柯丽斯,第二计算机Windows 10 Matlab 2014B)。C++计算机应该作为服务器工作。将数据从C++发送到MATLAB工作很好,但是我不能向相反的方向发送数据。每次我的C++程序到达RevVoF(),它将在这一点空闲,而不再做任何事情,即使MATLAB正在不断地发送数据。我试图通过netcat接收ubuntu上的数据,同时用Matlab发送包,效果也不错。甚至我也尝试了使用select()的方法,但这只会导致程序到达select()时等待10秒,然后再次冻结在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; intsocket=Socket(AF_INET,SOCK_DGRAM,0); /*FD_零点(和插座组); FD_套件(插座和插座套件); sTimeval.tv_sec=0.1; sTimeval.tv_usec=0; int status=select(套接字+1,&SockSet,(fd_set*)NULL,(fd_set*)NULL,&sTimeval); cout

套接字UDP-程序在recvfrom处停止 我尝试通过UDP从计算机发送数据到另一台计算机(第一台计算机:Ubuntu,C++与伊柯丽斯,第二计算机Windows 10 Matlab 2014B)。C++计算机应该作为服务器工作。将数据从C++发送到MATLAB工作很好,但是我不能向相反的方向发送数据。每次我的C++程序到达RevVoF(),它将在这一点空闲,而不再做任何事情,即使MATLAB正在不断地发送数据。我试图通过netcat接收ubuntu上的数据,同时用Matlab发送包,效果也不错。甚至我也尝试了使用select()的方法,但这只会导致程序到达select()时等待10秒,然后再次冻结在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; intsocket=Socket(AF_INET,SOCK_DGRAM,0); /*FD_零点(和插座组); FD_套件(插座和插座套件); sTimeval.tv_sec=0.1; sTimeval.tv_usec=0; int status=select(套接字+1,&SockSet,(fd_set*)NULL,(fd_set*)NULL,&sTimeval); cout,c++,matlab,sockets,recvfrom,C++,Matlab,Sockets,Recvfrom,在调试模式下运行程序后,程序突然通过recvfrom,但没有接收发送的数据。即使我在while循环中运行recvfrom并不断向端口发送数据,recvfrom也永远不会得到一个包。如果我尝试在它之前运行listen和accept(我通常知道udp连接不需要它),函数都返回-1。但是我不明白为什么我的套接字没有准备好接收数据。也许没有人有办法解决这个问题 192.168.56.101,这是unix框还是matlab框?如果您不希望recvfrom()在收到某些数据之前阻塞,那么您需要将套接字设置为

在调试模式下运行程序后,程序突然通过recvfrom,但没有接收发送的数据。即使我在while循环中运行recvfrom并不断向端口发送数据,recvfrom也永远不会得到一个包。如果我尝试在它之前运行listen和accept(我通常知道udp连接不需要它),函数都返回-1。但是我不明白为什么我的套接字没有准备好接收数据。也许没有人有办法解决这个问题

192.168.56.101,这是unix框还是matlab框?如果您不希望recvfrom()在收到某些数据之前阻塞,那么您需要将套接字设置为非阻塞模式。(在本网站的搜索框中搜索非阻塞,您将看到许多关于如何执行此操作的问题和答案)。谢谢您的回答。我已经尝试将套接字设置为非阻塞模式,之后我的程序不再冻结。但问题是我通过Matlab发送数据,所以recvfrom()应该得到一些数据,然后程序应该更进一步。但你能理解为什么这不会发生吗?正如我所说的,当我通过MATLAB发送数据并用NETCAT测试数据是否到达C++计算机时,一切都很好。经过长时间的搜索,我解决了这个问题。捆绑插座会导致错误。错误1:使用sizeof(&server)而不是sizeof(server),错误2:如果绑定…=!1而不是-1。所以绑定套接字从来没有成功过,因为请求wheter bind is=!1程序告诉我绑定成功了,但它没有成功。