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

C语言客户端-服务器Socket程序连接被拒绝问题求助

解决Socket客户端连接被拒绝的问题

问题根源

你的服务器代码存在关键疏漏:未将端口号转换为网络字节序并赋值给serv_addr.sin_port。这会导致bind操作无法正确绑定到指定的9999端口,客户端发起连接时自然会触发Connection refused错误。

修正后的服务器代码

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

void error(const char *err){
    perror(err); // 输出错误描述的函数
    exit(1);
}

int main(int argc, char *argv[]){ 
    if (argc < 2){
        fprintf(stderr, "未提供端口号,程序终止\n");
        exit(1);
    }
    int sockfd, newsockfd, portno, n;
    char buffer[255];
    struct sockaddr_in serv_addr, cli_addr;
    socklen_t clilen;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if(sockfd < 0){
        error("打开Socket失败");
    }
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = atoi(argv[1]);

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    // 新增:将端口号转换为网络字节序并赋值
    serv_addr.sin_port = htons(portno);

    if(bind(sockfd,(struct sockaddr *)&serv_addr, sizeof(serv_addr))<0){
        error("绑定失败");
    }

    listen(sockfd, 5);
    clilen = sizeof(cli_addr);

    newsockfd = accept(sockfd, (struct sockaddr*) &cli_addr, &clilen);

    if (newsockfd < 0){
        error("接受连接失败");
    }

    while(1){
        bzero(buffer, 255);
        n = read(newsockfd, buffer, 255);
        if(n < 0){
            error("读取失败");
        }
        printf("客户端:%s\n", buffer);
        bzero(buffer, 255);
        fgets(buffer, 255, stdin);

        n = write(newsockfd, buffer, strlen(buffer));
        if(n < 0){
            error("写入失败");
        }
        int i = strncmp("Exit", buffer, 4);
        if(i == 0){
            break;
        }
    }
    close(newsockfd);
    close(sockfd);
    return 0;
}

额外优化建议

  1. 客户端代码中,gethostbyname返回NULL时仅打印错误但未终止程序,建议补充退出逻辑避免后续异常:
    if(server == NULL){
        fprintf(stderr,"错误:不存在该主机\n");
        exit(1);
    }
    
  2. 检查端口占用:启动服务器前,可通过lsof -i :9999或netstat -tulpn | grep 9999确认9999端口未被其他程序占用。
  3. 完善读写逻辑:当前代码仅处理了返回值<0的错误情况,建议补充判断返回值为0的场景(表示对方已关闭连接),避免无限等待。

验证步骤

  1. 重新编译修正后的服务器:gcc server.c -o server
  2. 启动服务器:./server 9999
  3. 启动客户端:./client 127.0.0.1 9999
    此时客户端应能正常连接并与服务器实现双向消息传输。

内容的提问来源于stack exchange,提问作者Harikesh Pratap Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:31:41