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

C语言Socket编程服务器代码编译报错求助

排查C语言Socket服务器代码的编译错误

我帮你梳理下代码里导致编译失败的核心问题,顺便给你优化下运行时的健壮性:

1. 字节序转换函数拼写错误

你写的htron(10024)是笔误,标准库中不存在这个函数,正确的应该是htons()——全称是host to network short,专门用来将16位主机字节序的端口号转换为网络字节序。这个拼写错误会直接触发编译报错。

2. 字符串字面量的非法换行

你的message字符串定义里直接在双引号内换行:

char message[] = {"Hi this is the server.
"};

C语言不允许字符串字面量直接跨物理行(除非用反斜杠\做行延续),这种写法会让编译器无法正确解析字符串,引发语法错误。规范的写法是用转义字符\n表示换行。

修正后的完整可编译代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main(int argc, char *argv[]){ 
    // 初始化缓冲区
    char inputBuffer[256] = {}; 
    // 修正字符串换行问题,用\n替代物理换行
    char message[] = {"Hi this is the server.\n"}; 
    int sockfd = 0; 
    int forClientSocketfd = 0; 

    // 创建套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0); 
    if(sockfd == -1) {
        printf("Fail to create the socket.\n");
        exit(EXIT_FAILURE); // 出错后直接退出,避免后续无效执行
    }

    // 配置服务器地址信息
    struct sockaddr_in serverInfo, clientInfo; 
    socklen_t addrlen = sizeof(clientInfo); // 改用socklen_t类型,匹配accept函数的参数要求
    bzero(&serverInfo, sizeof(serverInfo)); 
    serverInfo.sin_family = PF_INET; 
    serverInfo.sin_addr.s_addr = INADDR_ANY; 
    // 修正为正确的htons函数
    serverInfo.sin_port = htons(10024); 

    // 绑定套接字到指定端口,增加错误检查
    if(bind(sockfd, (struct sockaddr *) &serverInfo, sizeof(serverInfo)) == -1) {
        perror("Bind failed");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    // 监听连接请求,增加错误检查
    if(listen(sockfd, 5) == -1) {
        perror("Listen failed");
        close(sockfd);
        exit(EXIT_FAILURE);
    }

    // 循环处理客户端连接
    while(1){ 
        forClientSocketfd = accept(sockfd, (struct sockaddr*) &clientInfo, &addrlen); 
        if(forClientSocketfd == -1) {
            perror("Accept failed");
            continue; // 出错后继续等待下一个连接
        }
        // 用strlen替代sizeof,避免发送字符串末尾的空字符(可选优化)
        send(forClientSocketfd, message, strlen(message), 0); 
        // 预留一个字节给空字符,避免缓冲区溢出
        ssize_t recv_len = recv(forClientSocketfd, inputBuffer, sizeof(inputBuffer)-1, 0); 
        if(recv_len > 0) {
            inputBuffer[recv_len] = '\0'; // 手动添加字符串结束符,确保printf正常输出
            printf("Received from client: %s\n", inputBuffer); 
        } else if(recv_len == 0) {
            printf("Client disconnected\n");
        } else {
            perror("Receive failed");
        }
        close(forClientSocketfd); // 处理完请求后关闭客户端套接字,避免资源泄漏
    } 
    close(sockfd); // 实际不会执行,但保留作为规范
    return 0; 
}

额外的优化说明

我还给代码加了这些实用的改进:

  • 给bind、listen、accept都加上了错误检查,方便你定位运行时的问题(比如端口被占用)
  • recv时预留一个字节的空间,手动添加字符串结束符,避免缓冲区溢出导致的异常
  • 处理完每个客户端请求后关闭套接字,防止系统文件描述符被耗尽
  • 把addrlen改成socklen_t类型,严格匹配系统API的参数要求,避免编译器警告

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:44:13