首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sendto:无效参数

sendto:无效参数
EN

Stack Overflow用户
提问于 2014-03-15 04:25:08
回答 1查看 14.5K关注 0票数 0

我试图让一个程序(客户机)使用C语言的套接字与另一个(服务器)通信,但我不断地从服务器得到错误"Invalid Argument“。

在解释了发生了什么之后,我将尝试展示与此问题相关的代码片段:

当涉及到客户端时,我假设一切都正常工作:客户端向服务器发送请求,服务器正确地接收消息,但是当服务器试图回复时,我得到了一个“无效参数”错误。

这是服务器的main函数使用的变量的声明:

代码语言:javascript
复制
int port = DEFAULT_PORT;
int sock;
struct sockaddr_in hostAdress, clientAdress;
socklen_t clientAdressLength;

在这里,我将套接字绑定到hostAdress:

代码语言:javascript
复制
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:

代码语言:javascript
复制
recvfrom(sock, dataBuffer, sizeof(dataBuffer), 0, (struct sockaddr*)&clientAdress, &clientAdressLength);

当服务器接收到请求时,它会识别该请求并跳转到此函数(此行为得到确认):

代码语言:javascript
复制
handle_helloRQ(sock, clientAdress, clientAdressLength);

虽然我知道做sizeof(clientAdress)可以获得"clientAdressLength“,但不知何故这样做解决了我上次遇到的同样的问题。此函数声明为:

代码语言:javascript
复制
int handle_helloRQ(int sock, struct sockaddr_in server_addr, socklen_t server_addr_length)

在此函数中,主要变量为:

代码语言:javascript
复制
char buffer[512];
size_t bufferSize = sizeof(buffer);
memset(&buffer, 0, sizeof(buffer));
stshort(2, buffer);
strcat(buffer+2, "Hello World");

stshort是一个简单的宏,它在缓冲区的前2个字节中放置一个短int。这可以达到预期的效果。

完成此操作后,它将尝试执行以下操作:

代码语言:javascript
复制
sendto(sock, buffer, bufferSize, 0, (struct sockaddr*)&server_addr, server_addr_length);

..。这就是事情出错的时候。sendto返回-1,使用perror("sendto");我得到一个"Invalid Argument“错误。我尝试了上千种不同的方法来输入参数,但我无法找到一个错误。当涉及到这类问题时,我已经用尽了我的其他选择(即,询问我所在大学的老师,并将代码展示给一些更高级的同事),似乎没有人能够找到错误。顺便说一句,我确实使用了

代码语言:javascript
复制
close(sock);

当服务器接收到要关闭的信号时,我可能不得不强制关闭它一次,然后它才能达到此功能。

无论是谁在读这篇文章,感谢你抽出时间!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-15 09:12:07

试着这样做:

代码语言:javascript
复制
sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); // <-- add protocol
...    
clientAdressLength = sizeof(clientAdress); // <-- add this
recvfrom(sock, dataBuffer, sizeof(dataBuffer), 0, (struct sockaddr*)&clientAdress, &clientAdressLength);
...
handle_helloRQ(sock, (struct sockaddr*)&clientAdress, clientAdressLength); // <-- pass address by pointer
...
close(sock);

代码语言:javascript
复制
int handle_helloRQ(int sock, struct sockaddr* recip_addr, socklen_t recip_addr_length)
{
    char buffer[512];
    memset(&buffer, 0, sizeof(buffer));
    stshort(2, buffer);
    strcat(buffer+2, "Hello World");

    sendto(sock, buffer, sizeof(buffer), 0, recip_addr, recip_addr_length);
    ...
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22415077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档