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
相关产品推荐
相关产品推荐

