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

C语言Socket程序卡在listen()函数问题求助

TCP Socket编程问题排查

服务器端看似卡在listen()的原因

你的代码并没有阻塞在listen()函数,实际是两个细节导致的错觉:

  • 输出缓冲未刷新:printf("server listening");缺少换行符\n,stdout是行缓冲模式,无换行时内容会暂存缓冲区,不会立刻显示到终端。代码实际已经执行到accept(),而accept()是阻塞函数,会一直等待客户端连接,所以看起来像停在listen环节。
  • 端口字节序错误:serveraddr.sin_port=port;直接使用主机字节序的端口号,正确做法是用htons(port)转换为网络字节序,否则绑定的端口可能不是预期的5566,客户端根本连不上。
  • IP解析未做检查:inet_addr(ip)如果解析失败会返回INADDR_NONE,这会导致绑定错误,需要添加检查逻辑。

客户端bind错误的解决方案

TCP客户端完全不需要手动调用bind。调用connect()前,操作系统会自动为客户端分配可用的本地端口和IP。手动bind容易触发错误:比如端口被占用、绑定低端口需要root权限、指定IP非本地可用等。客户端只需创建socket,初始化服务器地址,直接调用connect()即可。

修正后的服务器代码

#include<stdio.h>
#include<stdlib.h>
#include<arpa/inet.h>
#include<string.h>
#include<unistd.h>

int main(){
    char *ip="127.0.0.1";
    int port =5566;
    int server_sock,client_sock;
    struct sockaddr_in serveraddr,clientaddr;
    socklen_t addr_size;
    char buffer[1024];
    int n;

    server_sock=socket(AF_INET,SOCK_STREAM,0);
    if(server_sock<0){
        perror("[-]Socket error");
        exit(1);
    }
    printf("[+] TCP server socket created\n");

    memset(&serveraddr,'\0',sizeof(serveraddr));
    serveraddr.sin_family=AF_INET;
    serveraddr.sin_port=htons(port); // 转换端口为网络字节序
    serveraddr.sin_addr.s_addr=inet_addr(ip);
    if(serveraddr.sin_addr.s_addr == INADDR_NONE){ // 检查IP解析结果
        perror("[-]Invalid IP address");
        exit(1);
    }

    n=bind(server_sock,(struct sockaddr*)&serveraddr,sizeof(serveraddr));
    if(n<0){
        perror("[-]Bind error");
        exit(1);
    }
    printf("[+] TCP SOCKET BOUND to port %d\n",port);

    n=listen(server_sock,5);
    if(n<0){
        perror("listen error");
        exit(1);
    }
    printf("server listening\n"); // 添加换行刷新输出

    while(1){
        addr_size=sizeof(clientaddr);
        client_sock=accept(server_sock,(struct sockaddr*) &clientaddr,&addr_size);
        if(client_sock < 0){ // 检查accept错误
            perror("[-]Accept error");
            continue;
        }
        printf("[+]Client Connected.\n");
        close(client_sock); // 关闭客户端socket,避免资源泄漏
    }

    close(server_sock);
    return 0;
}

内容的提问来源于stack exchange,提问作者Fitz chivalry farseer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:22:41