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

C++ TCP客户端connect函数失效,无法连接服务器求助

解决TCP客户端connect连接失败的问题

我仔细看了你的代码,发现几个关键问题导致客户端连接直接终止,最核心的是connect函数的返回值判断完全搞反了,咱们一步步拆解解决:

核心问题:客户端connect的判断逻辑错误

POSIX标准中,connect()函数成功建立连接时返回0,失败时返回**-1**,但你的客户端代码写的是:

if(connect(client,(struct sockaddr *) &server_addr, sizeof(server_addr))>0)

这就意味着:只有当connect返回正数(也就是连接失败)时才会进入聊天循环,而连接成功返回0的情况下,反而会走到else分支,输出"Connection Failed"然后直接终止程序!这就是你看到连接直接断开的根本原因。

把判断逻辑修正为:

if(connect(client,(struct sockaddr *) &server_addr, sizeof(server_addr)) == 0)

服务端的变量命名与细节错误(非致命但易混淆)

你的服务端代码里把监听socket命名为client,把客户端连接的socket命名为server,完全搞反了变量语义,虽然功能上能跑,但非常容易后续出错。另外还有个细节错误:server_addr.sin_addr.s_addr= htons(INADDR_ANY);,INADDR_ANY是32位整数,应该用htonl()转换字节序,而不是htons()。

修正后的服务端核心变量部分:

// 创建监听socket
int listen_fd = socket(AF_INET,SOCK_STREAM,0);
if(listen_fd <0)
{
    perror("Error establishing socket");
    return 0;
}
cout<<"Socket connection established \n";

server_addr.sin_family= AF_INET;
server_addr.sin_addr.s_addr= htonl(INADDR_ANY); // 修正为htonl
server_addr.sin_port= htons(portNum);

// 绑定到监听socket
if(bind(listen_fd, (struct sockaddr *) &server_addr, sizeof(server_addr))<0)
{
    perror("Error binding socket");
    return 0;
}

listen(listen_fd,1);
// 接受客户端连接,得到连接socket
int conn_fd = accept(listen_fd, (struct sockaddr *)&server_addr, &size);

其他需要优化的细节

  • gets()函数不安全:这个函数会导致缓冲区溢出,强烈建议替换为fgets(),同时手动去掉读取到的换行符:
    fgets(buffer, buffersize, stdin);
    buffer[strcspn(buffer, "\n")] = '\0'; // 截断换行符
    
  • 处理recv/send的返回值:这两个函数会返回实际读写的字节数,或者-1表示错误,忽略返回值可能导致数据不完整或连接断开无法被感知。
  • 端口权限问题:80端口是HTTP默认端口,需要root权限才能绑定,如果你不是以root身份运行服务端,建议换成1024以上的端口(比如8080),避免权限不足的问题。
  • 关闭socket资源:程序末尾记得调用close()关闭socket,避免系统资源泄漏。

修正后的客户端核心代码片段

if(connect(client,(struct sockaddr *) &server_addr, sizeof(server_addr)) == 0)
{
    cout<<"\nWrite Bye to end connection\n";
    while(1)
    {
        cout<<"Server: ";
        ssize_t recv_len = recv(client,buffer,buffersize,0);
        if(recv_len <=0) {
            cout<<"Server disconnected\n";
            break;
        }
        buffer[recv_len] = '\0'; // 确保字符串以'\0'结尾
        printf("%s\n",buffer);
        
        cout<<"Client: ";
        fgets(buffer,buffersize,stdin);
        buffer[strcspn(buffer,"\n")] = '\0'; // 去掉换行符
        
        ssize_t send_len = send(client,buffer,strlen(buffer)+1,0);
        if(send_len <=0) {
            cout<<"Send failed\n";
            break;
        }
        
        if(strcmp(buffer,"Bye")==0)
            break;
    }
}
else
{
    perror("Connection Failed"); // 用perror打印具体错误原因,比如连接被拒绝
}
cout<<"Connection terminated \n";
close(client); // 关闭socket资源

修正后的服务端核心代码片段

int listen_fd = socket(AF_INET,SOCK_STREAM,0);
if(listen_fd <0)
{
    perror("Error establishing socket");
    return 0;
}
cout<<"Socket connection established \n";

server_addr.sin_family= AF_INET;
server_addr.sin_addr.s_addr= htonl(INADDR_ANY);
server_addr.sin_port= htons(portNum);

if(bind(listen_fd, (struct sockaddr *) &server_addr, sizeof(server_addr))<0)
{
    perror("Error binding socket");
    return 0;
}

size= sizeof(server_addr);
cout<<"Looking for clients\n";
listen(listen_fd,1);

int conn_fd = accept(listen_fd, (struct sockaddr *)&server_addr, &size);
if(conn_fd <0)
{
    perror("Error on accepting");
    return 0;
}

if(conn_fd >0)
{
    cout<<"\nType Bye to end connection\n";
    while(1)
    {
        cout<<"Server: ";
        fgets(buffer,buffersize,stdin);
        buffer[strcspn(buffer,"\n")] = '\0';
        
        send(conn_fd,buffer,strlen(buffer)+1,0);
        if(strcmp(buffer,"Bye")==0)
            break;
            
        ssize_t recv_len = recv(conn_fd,buffer,buffersize,0);
        if(recv_len <=0) {
            cout<<"Client disconnected\n";
            break;
        }
        buffer[recv_len] = '\0';
        cout<<"Client: "<<buffer<<"\n";
        
        if(strcmp(buffer,"Bye")==0)
            break;
    }
}
cout<<"Connection terminated ";
close(conn_fd);
close(listen_fd); // 关闭监听socket

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:46:54