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

