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; }
额外优化建议
- 客户端代码中,
gethostbyname返回NULL时仅打印错误但未终止程序,建议补充退出逻辑避免后续异常:if(server == NULL){ fprintf(stderr,"错误:不存在该主机\n"); exit(1); } - 检查端口占用:启动服务器前,可通过
lsof -i :9999或netstat -tulpn | grep 9999确认9999端口未被其他程序占用。 - 完善读写逻辑:当前代码仅处理了返回值<0的错误情况,建议补充判断返回值为0的场景(表示对方已关闭连接),避免无限等待。
验证步骤
- 重新编译修正后的服务器:
gcc server.c -o server - 启动服务器:
./server 9999 - 启动客户端:
./client 127.0.0.1 9999
此时客户端应能正常连接并与服务器实现双向消息传输。
内容的提问来源于stack exchange,提问作者Harikesh Pratap Singh
相关产品推荐
相关产品推荐

