c - 发送到:无效参数

标签 c linux sockets sendto

我试图让程序(客户端)使用 C 中的套接字与另一个程序(服务器)通信,但我不断从服务器收到错误“无效参数”。

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

当谈到客户端时,我假设一切正常:客户端向服务器发送请求并且服务器正确接收消息,但是当服务器尝试回复时我收到“无效参数”错误。

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

int port = DEFAULT_PORT;
int sock;
struct sockaddr_in hostAdress, clientAdress;
socklen_t clientAdressLength;

这里我将套接字绑定(bind)到主机地址:

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);

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

对于正在阅读本文的人,感谢您的宝贵时间!

最佳答案

试试这个:

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);

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);
    ...
}

关于c - 发送到:无效参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22415077/

相关文章:

c - 我在哪里可以合法地在 C99 中声明变量?

javascript - 如何在 Windows 上使用 MAKE 构建项目? (它从源 JS 文件构建输出)

qt - 如何使用 Qt 检测服务器的客户端是否崩溃(或退出)

c# - 具有多个客户端的异步套接字服务器

Python ssl 无法使用 TLS1.2 客户端连接到 TLS1.2 服务器

c++ - 如何查找目标文件 *.o 的 ram rom 使用情况(.bss .text .rodata .data)?

c - 如何使用 MPI 传递带有动态数组的自定义结构?

c++ - 如何使 linux 命令行程序在 windows 中运行?

linux - 用于发送邮件的 ssh 隧道

c++ - 获取进程当前堆大小的 API 调用?