C语言Socket编程服务器代码编译报错求助
排查C语言Socket服务器代码的编译错误
我帮你梳理下代码里导致编译失败的核心问题,顺便给你优化下运行时的健壮性:
1. 字节序转换函数拼写错误
你写的htron(10024)是笔误,标准库中不存在这个函数,正确的应该是htons()——全称是host to network short,专门用来将16位主机字节序的端口号转换为网络字节序。这个拼写错误会直接触发编译报错。
2. 字符串字面量的非法换行
你的message字符串定义里直接在双引号内换行:
char message[] = {"Hi this is the server. "};
C语言不允许字符串字面量直接跨物理行(除非用反斜杠\做行延续),这种写法会让编译器无法正确解析字符串,引发语法错误。规范的写法是用转义字符\n表示换行。
修正后的完整可编译代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> int main(int argc, char *argv[]){ // 初始化缓冲区 char inputBuffer[256] = {}; // 修正字符串换行问题,用\n替代物理换行 char message[] = {"Hi this is the server.\n"}; int sockfd = 0; int forClientSocketfd = 0; // 创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd == -1) { printf("Fail to create the socket.\n"); exit(EXIT_FAILURE); // 出错后直接退出,避免后续无效执行 } // 配置服务器地址信息 struct sockaddr_in serverInfo, clientInfo; socklen_t addrlen = sizeof(clientInfo); // 改用socklen_t类型,匹配accept函数的参数要求 bzero(&serverInfo, sizeof(serverInfo)); serverInfo.sin_family = PF_INET; serverInfo.sin_addr.s_addr = INADDR_ANY; // 修正为正确的htons函数 serverInfo.sin_port = htons(10024); // 绑定套接字到指定端口,增加错误检查 if(bind(sockfd, (struct sockaddr *) &serverInfo, sizeof(serverInfo)) == -1) { perror("Bind failed"); close(sockfd); exit(EXIT_FAILURE); } // 监听连接请求,增加错误检查 if(listen(sockfd, 5) == -1) { perror("Listen failed"); close(sockfd); exit(EXIT_FAILURE); } // 循环处理客户端连接 while(1){ forClientSocketfd = accept(sockfd, (struct sockaddr*) &clientInfo, &addrlen); if(forClientSocketfd == -1) { perror("Accept failed"); continue; // 出错后继续等待下一个连接 } // 用strlen替代sizeof,避免发送字符串末尾的空字符(可选优化) send(forClientSocketfd, message, strlen(message), 0); // 预留一个字节给空字符,避免缓冲区溢出 ssize_t recv_len = recv(forClientSocketfd, inputBuffer, sizeof(inputBuffer)-1, 0); if(recv_len > 0) { inputBuffer[recv_len] = '\0'; // 手动添加字符串结束符,确保printf正常输出 printf("Received from client: %s\n", inputBuffer); } else if(recv_len == 0) { printf("Client disconnected\n"); } else { perror("Receive failed"); } close(forClientSocketfd); // 处理完请求后关闭客户端套接字,避免资源泄漏 } close(sockfd); // 实际不会执行,但保留作为规范 return 0; }
额外的优化说明
我还给代码加了这些实用的改进:
- 给
bind、listen、accept都加上了错误检查,方便你定位运行时的问题(比如端口被占用) recv时预留一个字节的空间,手动添加字符串结束符,避免缓冲区溢出导致的异常- 处理完每个客户端请求后关闭套接字,防止系统文件描述符被耗尽
- 把
addrlen改成socklen_t类型,严格匹配系统API的参数要求,避免编译器警告
内容的提问来源于stack exchange,提问作者Toby Liao
相关产品推荐
相关产品推荐

