我试图让一个程序(客户端)使用 C 中的套接字与另一个(服务器)通信,但我经常从服务器收到错误“Invalid Argument”。
在解释发生了什么之后,我将尝试显示与此问题相关的代码片段:
对于客户端,我假设一切正常:客户端向服务器发送请求,服务器正确接收消息,但是当服务器尝试回复时,我收到“无效参数”错误。
这是服务器主函数使用的变量的声明:
int port = DEFAULT_PORT;
int sock;
struct sockaddr_in hostAdress, clientAdress;
socklen_t clientAdressLength;
在这里,我将套接字绑定到 hostAdress:
sock = socket(PF_INET,SOCK_DGRAM,0);
memset(&hostAdress, 0, sizeof(struct sockaddr_in));
memset(&clientAdress, 0, sizeof(struct sockaddr_in));
hostAdress.sin_family = AF_INET;
hostAdress.sin_port = htons(port);
hostAdress.sin_addr.s_addr = INADDR_ANY;
bind(sock, (struct sockaddr*) &hostAdress, sizeof(hostAdress));
经过一些代码,我进入一个循环接收信息,以这种方式使用 recvfrom :
recvfrom(sock, dataBuffer, sizeof(dataBuffer), 0, (struct sockaddr*)&clientAdress, &clientAdressLength);
当服务器收到请求时,识别它并跳转到这个函数(这个行为被确认):
handle_helloRQ(sock, clientAdress, clientAdressLength);
虽然我知道可以通过 sizeof(clientAdress) 获得“clientAdressLength”,但不知何故这样做解决了我上次遇到的同样问题。该函数声明为:
int handle_helloRQ(int sock, struct sockaddr_in server_addr, socklen_t server_addr_length)
在这个函数中,主要变量是:
char buffer[512];
size_t bufferSize = sizeof(buffer);
memset(&buffer, 0, sizeof(buffer));
stshort(2, buffer);
strcat(buffer+2, "Hello World");
stshort 是一个简单的宏,它在缓冲区的前 2 个字节中放置一个 short int。这按预期工作。
完成后,它会尝试执行以下操作:
sendto(sock, buffer, bufferSize, 0, (struct sockaddr*)&server_addr, server_addr_length);
......这就是事情出错的时候。sendto 返回-1
,并使用perror("sendto");
我得到一个“ Invalid Argument
”错误。我尝试了一千种不同的方法来估算参数,但我找不到错误。遇到此类问题,我已经用尽了其他选择(即询问我大学的老师并将代码展示给一些更高级的同事),似乎没有人能够找到错误。作为旁注,我确实使用
close(sock);
当服务器接收到要关闭的信号时,但我可能不得不在它设法达到此功能之前强制关闭它一次。
对于正在阅读本文的人,感谢您的宝贵时间!