You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C Socket开发:router.c中sendto返回Invalid argument错误求助

排查sendto()返回"Invalid Argument"错误的常见思路

嘿,针对你在router.c里遇到的sendto报错问题,我帮你梳理几个UDP套接字场景下最容易触发EINVAL(也就是你看到的Invalid Argument)的原因,逐个排查应该能解决:

1. 套接字类型搞混了

你第二个用来发消息到server的socket,必须是UDP类型(SOCK_DGRAM)。如果不小心创建成了TCP的SOCK_STREAM,那用sendto肯定会报错——因为TCP是面向连接的,不需要额外指定目标地址。

检查你的socket创建代码,确保是这样:

int client_sock = socket(AF_INET, SOCK_DGRAM, 0);
if (client_sock == -1) {
    perror("Failed to create client socket");
    exit(EXIT_FAILURE);
}

2. 目标地址结构体的长度传错了

sendto的最后一个参数是目标地址结构体的实际大小,这个值绝对不能乱传。比如你用的是sockaddr_in结构体,就必须传sizeof(struct sockaddr_in),而不是sizeof(struct sockaddr)(虽然IPV4下两者大小一致,但规范写法是用实际结构体的大小,传错就会触发EINVAL)。

正确的地址初始化+sendto写法参考:

struct sockaddr_in server_addr;
// 先清空结构体,避免脏数据
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(你的server端口号); // 记得转网络字节序
// 把server的IP转成网络字节序
if (inet_pton(AF_INET, "你的server IP地址", &server_addr.sin_addr) != 1) {
    perror("Invalid server IP");
    close(client_sock);
    exit(EXIT_FAILURE);
}

// 发送消息
ssize_t sent_bytes = sendto(client_sock, your_message, strlen(your_message), 0,
                           (struct sockaddr*)&server_addr, sizeof(server_addr));
if (sent_bytes == -1) {
    perror("sendto failed");
    close(client_sock);
    exit(EXIT_FAILURE);
}

3. 套接字已经被connect()绑定了目标地址

如果你的第二个socket之前调用过connect()和server的地址绑定了,那再用sendto指定目标地址就会报错。因为UDP套接字被connect后,就固定了唯一的目标地址,此时要么用send()代替sendto(不需要传地址),要么就不要调用connect,直接用sendto传地址。

4. 消息本身有问题

如果你的消息缓冲区是NULL,或者计算的长度是0(比如消息里提前出现了\0导致strlen返回0),也可能触发错误。确保你的消息内容有效,长度大于0。

最后一招:打印具体错误细节

在sendto失败后调用perror("sendto error"),它会输出更具体的错误描述,能帮你更快定位问题——比如如果是地址长度错了,perror可能会直接提示相关信息。

如果能把你第二个socket的完整创建、地址初始化和sendto代码补全,我还能帮你更精准地找bug~

内容的提问来源于stack exchange,提问作者foxy_86

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:54:31