类型'int*'与参数'socklen_t*'不兼容的UDP服务器代码问题求助
解决UDP服务器代码中
int*与socklen_t*类型不兼容的错误 错误原因
编译错误argument of type "int*" is incompatible with parameter of type "socklen_t*",是因为recvfrom函数的第6个参数要求传入**socklen_t*类型**的指针,但你的代码中定义了int len,传递&len时类型不匹配。socklen_t是POSIX标准定义的专门用于套接字地址长度的类型,和int并非同一类型(即便部分系统中两者长度相同,严格的编译器仍会触发类型检查错误)。
修改方案
- 修正变量类型:将
int len;改为socklen_t len;,确保和recvfrom的参数类型完全匹配。 - 修复
sendto的长度参数:当前代码用MAXLINE作为发送长度,会发送超出字符串实际长度的垃圾数据,应替换为strlen(message)。 - 添加错误处理:对
socket、bind、recvfrom的返回值做检查,避免程序静默失败。
修改后的完整代码
#include <iostream> #include <stdio.h> #include <strings.h> #include <sys/types.h> #include <arpa/inet.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> // 新增strlen所需头文件 #include "m-c2.h" #define PORT 8080 #define MAXLINE 1000 int main() { char buffer[100]; const char *message = "Hello Client"; // 改为const更安全,符合字符串字面量只读特性 int listenfd; socklen_t len; // 修正类型为socklen_t struct sockaddr_in servaddr, cliaddr; bzero(&servaddr, sizeof(servaddr)); // 创建UDP套接字 listenfd = socket(AF_INET, SOCK_DGRAM, 0); if (listenfd == -1) { perror("socket creation failed"); return 1; } servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(PORT); servaddr.sin_family = AF_INET; // 绑定服务器地址到套接字 if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1) { perror("bind failed"); close(listenfd); return 1; } // 接收客户端数据报 len = sizeof(cliaddr); int n = recvfrom(listenfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&cliaddr, &len); if (n == -1) { perror("recvfrom failed"); close(listenfd); return 1; } buffer[n] = '\0'; puts(buffer); // 发送响应给客户端 if (sendto(listenfd, message, strlen(message), 0, (struct sockaddr*)&cliaddr, len) == -1) { // 使用recvfrom返回的len,而非sizeof(cliaddr),更规范 perror("sendto failed"); close(listenfd); return 1; } close(listenfd); // 关闭套接字 return 0; }
额外说明
sendto的最后一个参数推荐使用recvfrom返回后更新的len值,客户端地址长度可能在recvfrom过程中被修正(UDP场景下虽少见,但这是符合POSIX标准的写法)。- 将
char *message改为const char *message,避免对只读字符串字面量的非法修改,消除潜在的未定义行为。
内容的提问来源于stack exchange,提问作者syphaeric
相关产品推荐
相关产品推荐

