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

Socket编程客户端连接失败求助(VM环境IPv4)

Socket客户端连接失败排查方案

问题场景

服务端运行状态正常,但运行以下Socket客户端代码时,出现「Cannot connect」错误提示。已确认客户端与服务端的端口号、IP地址完全一致,使用IPv4协议,运行环境为虚拟机。

客户端代码

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

struct sockaddr_in serv_addr;
char serv_ip[]="respective ip address";
unsigned short serv_port=9001;
char rbuff[128],w1buff[128],w2buff[128],w3buff[128];
int r, w1,w2,w3;

int main() {
    int skfd = socket(AF_INET,SOCK_STREAM,0);
    if(skfd < 0) {
        printf("\nCLIENT ERROR: Cannot create socket\n");
        exit(1);
    }
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(serv_port);  
    inet_aton(serv_ip, (&serv_addr.sin_addr));  
    
    int connect1 = connect(skfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
    
    if(connect1 < 0) {
        printf("\nCLIENT ERROR: Cannot connect\n");
        close(skfd);
        exit(1);
    }
    printf("\nCLIENT: Connected to the server\n");
    for(;;) {
        gets(w1buff);
        gets(w2buff);
        gets(w3buff);
        w1=write(skfd,w1buff,128);
        w2=write(skfd,w2buff,128);
        w3=write(skfd,w3buff,128);
        if (w1<0 || w2<0 || w3<0) {
            printf("\nCLIENT ERROR: Cannot send message to the echo server\n");
            close(skfd);
            exit(1);
        }   
        r = read(skfd, rbuff, 128);
        if (r<0) 
            printf("\nCLIENT ERROR: Cannot receive message from client.\n");
        else {
            if(r<0)
                printf("\nCLIENT ERROR: Cannot receive message from the server.\n");
            else {
                rbuff[r]='\0';
                printf("\nCLIENT: Res: %s \n",rbuff);
                
            }
        }
    }
}

排查步骤

  • 验证网络连通性

    • 在客户端虚拟机执行 ping 服务端IP,确认跨虚拟机网络可达。若不通,检查虚拟机网络模式(桥接/NAT)配置,以及宿主机与虚拟机的网络链路。
    • 用 telnet 服务端IP 9001 测试端口是否开放,若telnet无法连接,说明端口未被服务端监听或存在流量拦截。
  • 检查服务端监听配置

    • 确认服务端socket绑定的地址是 0.0.0.0(允许所有IP访问),而非仅本地回环的 127.0.0.1(仅本机可访问)。
    • 在服务端执行 netstat -tulpn | grep 9001,查看端口是否处于LISTEN状态,且监听地址符合预期。
  • 修复客户端代码的潜在问题

    • 增加IP地址有效性校验:inet_aton 会在IP格式错误时返回0,代码未做处理可能导致连接到无效地址,添加如下判断:
      if (!inet_aton(serv_ip, &serv_addr.sin_addr)) {
          printf("CLIENT ERROR: Invalid IP address\n");
          close(skfd);
          exit(1);
      }
      
    • 打印具体错误信息:将连接失败的printf改为perror("CLIENT ERROR: Cannot connect");,这样能获取系统调用返回的具体错误原因(如ECONNREFUSED表示端口未监听,ETIMEDOUT表示网络超时)。
  • 排查虚拟机环境特殊限制

    • 若使用NAT网络模式,确认端口转发规则是否正确(跨宿主机与虚拟机连接时需要)。
    • 临时关闭虚拟机及宿主机的防火墙测试,例如Linux下执行 sudo systemctl stop firewalld,排除防火墙拦截TCP流量的可能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 00:11:22