Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未在客户端获取输出(C中的UDP套接字)_C_Linux_Sockets_Network Programming_Udp - Fatal编程技术网

未在客户端获取输出(C中的UDP套接字)

未在客户端获取输出(C中的UDP套接字),c,linux,sockets,network-programming,udp,C,Linux,Sockets,Network Programming,Udp,这是我的UDP套接字服务器端和客户端代码 问题是,当我在终端中运行此程序时,一旦客户端到达服务器,服务器执行就会停止,但在客户端,我没有收到任何数据 int = recvfrom(network_socket, &server_response, sizeof(server_response), 0,(struct sockaddr*) &network_socket, (socklen_t*)&len); printf("The server sent the dat

这是我的UDP套接字服务器端和客户端代码

问题是,当我在终端中运行此程序时,一旦客户端到达服务器,服务器执行就会停止,但在客户端,我没有收到任何数据

int = recvfrom(network_socket, &server_response, sizeof(server_response), 0,(struct sockaddr*) &network_socket, (socklen_t*)&len);

printf("The server sent the data : %s\n", server_response);
客户c

包括 包括 包括 包括 包括 包括 包括 int main{ int网络接口; 网络插座=socketafinet,SOCK DGRAM,0; 服务器地址中的结构sockaddr\u; 服务器地址.sin\u family=AF\u INET; 服务器地址sin端口=htons9002; server_address.sin_addr.s_addr=INADDR\u ANY; sendtonetwork\u socket,0,0,MSG\u CONFIRM,const struct sockaddr*&服务器地址,sizeofserver\u地址; 字符服务器_响应[256]; int len=网络插座的尺寸; int=recvfromnetwork\u socket,&server\u response,sizeofserver\u response,0,struct sockaddr*&network\u socket,socklen\u t*&len; Printf服务器发送了数据:%s\n,服务器\u响应; 封闭式网络插座; 返回0; } 服务器.c

包括 包括 包括 包括 包括 包括 包括 int main{ char server_message[256]=您已到达UDP服务器; int服务器\u套接字,客户端\u地址; server_socket=socketAF INET,SOCK_DGRAM,0; 服务器地址中的结构sockaddr\u; 服务器地址.sin\u family=AF\u INET; 服务器地址sin端口=htons9002; server_address.sin_addr.s_addr=INADDR\u ANY; bindserver\u套接字,结构sockaddr*&服务器地址,sizeofserver\u地址; int n,len; len=sizeofclient\u地址; n=recvfromserver\u套接字、服务器消息、sizeofserver\u消息、0、结构sockaddr*&客户端地址、socklen\u t*&len; sendtoserver\u套接字、server\u消息、sizeofserver\u消息、0、结构sockaddr*&客户端地址、len; closeserver_套接字; 返回0; } 您没有发送任何数据

int = recvfrom(network_socket, &server_response, sizeof(server_response), 0,(struct sockaddr*) &network_socket, (socklen_t*)&len);

printf("The server sent the data : %s\n", server_response);

您没有保留接收的字节数,这就是recvfrom返回的字节数。所以你不知道你收到了多少数据。然后尝试通过%s打印此数据,这仅适用于C样式字符串。您不能使用它打印任意数据。至少,您必须告诉它要打印多少数据,否则,它怎么可能知道?你把这些信息扔掉了。

在这两方面,你根本没有做任何错误处理

在客户端,您不能将数据报发送到INADDR_,您需要发送到实际的IP地址。调用recvfrom时,您使用网络套接字文件描述符作为sockaddr\u in结构来接收发送方的地址/端口,这是错误的

在服务器端,当客户端地址需要是结构中的sockaddr\u时,您将其声明为int。您使用相同的char[]缓冲区来接收用于存储服务器问候消息的客户机数据,因此您实际上是在回显客户机发送的内容,这些内容不算什么,但您没有考虑客户机数据的大小。在recvfrom退出后,您误用了printf,因为客户端没有发送以null结尾的字符串,但%s需要一个

请尝试以下方法:

客户c

包括 包括 包括 包括 包括 包括 包括 包括 int main { int network_socket=socketAF INET,SOCK_DGRAM,0; 如果网络插座<0 { PerroSocket失败; 返回-1; } 服务器地址中的结构sockaddr\u; bzero&服务器地址,sizeofserver地址; 服务器地址.sin\u family=AF\u INET; 服务器地址sin端口=htons9002; 此处的服务器\u address.sin\u addr.s\u addr=inet\u addr服务器IP地址;//或本地主机的127.0.0.1 如果sendtonetwork\u socket,0,0,MSG\u CONFIRM,struct sockaddr*&服务器地址,sizeofserver\u地址 { 佩罗森托失败; 封闭式网络插座; 返回-1; } 字符服务器_响应[256]; 发件人地址中的结构sockaddr\u; socklen\u t addrlen=sizeofsender\u地址; int n=recvfromnetwork\u socket、server\u响应、sizeofserver\u响应、0、struct sockaddr*&发送方地址、&addrlen; //或者,由于您没有将发件人的sockaddr_用于任何用途: //int n=recvfromnetwork\u套接字,server\u响应,sizeofserver\u响应,0,NULL,NULL; 如果n<0 { perrorrecvfrom失败; 封闭式网络插座; 返回-1; } Printf服务器发送的数据:%.*s\n,n,服务器\u响应; 封闭式网络插座; 返回0; } 服务器.c

包括 包括 包括 包括 包括 包括 包括 包括 int main { char server_message[]=您已到达UDP服务器; int-server_-socket=socketAF-INET,SOCK-DGRAM,0; 如果服务器\u套接字<0 { PerroSocket失败; 返回-1; } 服务器地址中的结构sockaddr\u; bzero&服务器地址,sizeofserver地址; 服务器地址.sin\u family=AF\u INET; 服务器地址sin端口=htons9002; server_address.sin_addr.s_addr=INADDR\u ANY; 如果bindserver\u socket、struct sockaddr*&服务器\u地址、sizeofserver\u地址<0 { perrorbind失败; closeserver_套接字; 返回-1; } 字符客户端_消息[256]; 客户端地址中的结构sockaddr\u; socklen\u t addrlen=sizeofclient\u地址; int n=recvfromserver\u套接字、客户端消息、sizeofclient\u消息、0、结构sockaddr*&客户端地址、&addrlen; 如果n<0 { perrorrecvfrom失败; closeserver_套接字; 返回-1; } 打印客户端发送的数据:%.*s\n,n,客户端消息; 如果sendtoserver\u套接字、/*client\u message*/server\u message、/*n*/strlenserver\u message,0,struct sockaddr*&client\u address,addrlen<0 { 佩罗森托失败; closeserver_套接字; 返回-1; } closeserver_套接字; 返回0; }
我注意到两件事。首先,您正在发送一条0字节的消息。如果您将其更改为非零长度消息,是否会产生不同的效果。还有,你有没有用Wireshark之类的工具监控流量?端口9002被阻止的服务器端可能存在防火墙问题。在客户端,您需要指定服务器的IP地址吗?关于:int=recvfromnetwork\u socket,&server\u response,sizeofserver\u response,0,struct sockaddr*&network\u socket,socklen\u t*&len;这不是编译!在int和=之间需要有一个变量名。另外,recvfrom返回一个ssize\u t,而不是一个int:int=recvfromnetwork\u socket,&server\u响应,sizeofserver\u响应,0,struct sockaddr*&network\u socket,socklen\u t*&len;和`printf服务器发送数据:%s\n,服务器响应;`函数:recvfrom不会NUL终止数据读取,因此这两条语句之间必须有一条语句:server_response[]='\0';关于:server_address.sin_addr.s_addr=INADDR\u ANY;INADDR_ANY是字符串:0.0.0.0,不能直接赋值。建议:server\u address.sin\u addr.s\u addr=htonl INADDR\u ANY;您没有发送任何内容-在UDP中,可以发送负载中包含0字节的数据报。在接收端,recvfrom的返回值将为0。