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

类型'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并非同一类型(即便部分系统中两者长度相同,严格的编译器仍会触发类型检查错误)。

修改方案

  1. 修正变量类型:将int len;改为socklen_t len;,确保和recvfrom的参数类型完全匹配。
  2. 修复sendto的长度参数:当前代码用MAXLINE作为发送长度,会发送超出字符串实际长度的垃圾数据,应替换为strlen(message)。
  3. 添加错误处理:对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:45:44