You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

服务器接收消息并转换为大写的代码实现技术问询

实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:25:26