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
相关产品推荐
相关产品推荐

