服务器接收消息并转换为大写的代码实现技术问询
实现TCP服务器的小写转大写功能
没问题,我来帮你补全代码,实现服务器接收客户端消息并转成大写返回的功能。你已经有了读取消息的基础代码,只需要加上转换逻辑和回发步骤就可以了。
核心代码补全(基于你提供的片段)
首先,别忘了引入必要的头文件,然后在读取消息后添加转换和回发逻辑:
#include <ctype.h> // 必须包含这个头文件,toupper()函数依赖它 // 假设你已经完成了socket创建、绑定、监听、accept的流程,拿到了newsockfd ssize_t n; char buffer[256]; // 定义256长度的缓冲区,留一个位置给字符串终止符 // 读取客户端发送的消息 n = read(newsockfd, buffer, 255); if (n < 0) { perror("ERROR reading from socket"); exit(1); } // 手动添加字符串终止符,因为read()不会自动补全 buffer[n] = '\0'; printf("Here is the message: %s\n", buffer); // 核心逻辑:将小写字母转换为大写 for (int i = 0; i < n; i++) { // 转成unsigned char避免处理扩展ASCII字符时的负数问题 buffer[i] = toupper((unsigned char)buffer[i]); } // 将转换后的消息回发给客户端 n = write(newsockfd, buffer, n); if (n < 0) { perror("ERROR writing to socket"); exit(1); }
关键细节说明
- 头文件依赖:
toupper()函数属于<ctype.h>,一定要记得包含这个头文件,否则编译会报错。 - 字符串终止符:
read()函数只是读取字节流,不会自动添加'\0',所以我们必须手动在读取的最后一个字节后面加上,确保printf和字符串处理能正常工作。 - 字符转换安全:把字符转成
unsigned char再传入toupper(),可以避免某些扩展ASCII字符(值为负数)导致的未定义行为。 - 错误处理:给
read()和write()添加错误检查是服务器程序的基本操作,能帮你快速定位网络读写问题。 - 回发长度:回发时使用之前读取到的
n作为字节数,这样不会发送多余的空字符或者越界数据。
完整可运行的TCP服务器示例(可选)
如果你需要一个完整的可运行例子,这里包含了从socket创建到处理请求的全部流程:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <ctype.h> int main(int argc, char *argv[]) { int sockfd, newsockfd, portno; socklen_t clilen; char buffer[256]; struct sockaddr_in serv_addr, cli_addr; ssize_t n; // 创建TCP socket sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd < 0) { perror("ERROR opening socket"); exit(1); } // 初始化服务器地址结构 bzero((char *) &serv_addr, sizeof(serv_addr)); portno = 12345; // 选择一个未被占用的端口(可自行修改) serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; // 监听所有网卡地址 serv_addr.sin_port = htons(portno); // 转换为网络字节序 // 绑定socket到指定端口 if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { perror("ERROR on binding"); exit(1); } // 开始监听连接,最大等待队列长度为5 listen(sockfd, 5); clilen = sizeof(cli_addr); // 接受客户端连接(单线程版本,一次处理一个客户端) newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); if (newsockfd < 0) { perror("ERROR on accept"); exit(1); } // 读取消息、转换、回发 n = read(newsockfd, buffer, 255); if (n < 0) { perror("ERROR reading from socket"); exit(1); } buffer[n] = '\0'; printf("Received from client: %s\n", buffer); // 转换为大写 for (int i = 0; i < n; i++) { buffer[i] = toupper((unsigned char)buffer[i]); } // 发送回客户端 n = write(newsockfd, buffer, n); if (n < 0) { perror("ERROR writing to socket"); exit(1); } // 关闭socket连接 close(newsockfd); close(sockfd); return 0; }
编译运行方法
- 编译:
gcc server.c -o server - 启动服务器:
./server - 测试客户端:可以用
telnet localhost 12345或者nc localhost 12345,输入小写消息后就能收到大写的回复啦。
内容的提问来源于stack exchange,提问作者over
相关产品推荐
相关产品推荐

