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

UDP Socket客户端sendto报Invalid argument错误原因排查

问题分析:UDP客户端sendto报错"Invalid argument"

你遇到的sendto: Invalid argument错误主要来自两个关键的代码问题,我来逐一拆解:

1. sendto的缓冲区地址和长度参数错误

看这段代码:

if (sendto(sockfd, &test, sizeof(test), 0, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) {
    perror("sendto"); return -1;
}

这里有两个致命错误:

  • &test:test是一个char*类型的指针,&test取的是指针本身的地址(也就是char**类型),但sendto需要的是要发送的数据的起始地址,直接传test就可以了。
  • sizeof(test):这里计算的是指针变量的大小(在32位系统是4字节,64位是8字节),而不是你实际要发送的字符串的长度。你应该用strlen(test)来获取字符串的有效长度,或者直接用snprintf的返回值(因为snprintf会返回写入的字符数,不包括终止符)。

2. 端口转换函数使用错误

再看端口设置的代码:

servaddr.sin_port = (in_port_t) htonl(SERV_PORT);

SERV_PORT是端口号(通常是16位的无符号整数),htonl是用来转换32位长整型的主机字节序到网络字节序,而端口应该用htons(转换16位短整型)。用htonl会把端口号转成32位的值,强制转成in_port_t(16位)后会得到错误的端口值,导致servaddr结构体无效,这也是sendto返回"Invalid argument"的原因之一。

修正后的代码片段

把这两处错误修复后,相关代码应该改成这样:

// Send a test string
char *test = malloc(MAXLINE);
int send_len = snprintf(test, MAXLINE, "SENDING:%c", code);
if (sendto(sockfd, test, send_len, 0, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) {
    perror("sendto"); return -1;
}

// 端口设置修正
servaddr.sin_port = htons(SERV_PORT);

另外,记得用完test后要free(test),避免内存泄漏哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:38:16