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

C语言TCP Socket编程修改:客户端按空格后服务器发送时间戳

嘿,作为第一个Socket项目就尝试做交互功能,真的很不错!咱们把需求拆解一下:核心就是客户端主动触发请求(按空格键)→ 服务器收到请求后返回时间戳,分客户端和服务器两部分改就行,逻辑超清晰,我给你一步步讲:

第一步:修改客户端代码

原来的客户端是连接成功后直接等服务器发消息,现在要改成「等用户按空格键 → 给服务器发一个“我要时间戳”的信号 → 再接收服务器的回复」。

关键修改点:

  1. 连接成功后,提示用户按空格键;
  2. 监听键盘输入,直到用户按下空格键;
  3. 给服务器发送一个约定好的信号(新手用空格字符本身最直观);
  4. 然后再接收服务器返回的时间戳。

修改后的客户端核心代码片段:

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

int main() {
    // ... 原来的创建socket、连接服务器的代码保留 ...

    if (connect(sockfd, &addr, sizeof(addr)) == -1) {
        perror("connect failed");
        close(sockfd);
        return 1;
    }

    printf("Connected to server! Press Spacebar to get timestamp...\n");

    // 等待用户按空格键
    char input_char;
    do {
        input_char = getchar();
        // 忽略换行等其他输入,只等空格
        if (input_char != ' ' && input_char != '\n') {
            printf("Oops, please press Spacebar only!\n");
        }
    } while (input_char != ' ');

    // 给服务器发送空格信号
    send(sockfd, &input_char, 1, 0);

    // 接收服务器返回的时间戳(原来的代码保留)
    char buffer[1024];
    ssize_t bytes_received = recv(sockfd, buffer, sizeof(buffer)-1, 0);
    if (bytes_received > 0) {
        buffer[bytes_received] = '\0';
        printf("Got timestamp from server:\n%s", buffer);
    } else if (bytes_received == 0) {
        printf("Server closed the connection.\n");
    } else {
        perror("recv failed");
    }

    close(sockfd);
    return 0;
}
第二步:修改服务器代码

原来的服务器是连接成功后直接发时间戳,现在要改成「先接收客户端的请求信号 → 确认是约定的信号 → 再生成并发送时间戳」。

关键修改点:

  1. 接受客户端连接后,先等待接收客户端发来的信号;
  2. 判断收到的是不是约定的空格字符;
  3. 如果是,生成时间戳并发送;
  4. 处理接收失败或无效信号的情况。

修改后的服务器核心代码片段:

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>

int main() {
    // ... 原来的创建socket、绑定、监听的代码保留 ...

    while (1) {
        int new_fd = accept(sockfd, NULL, NULL);
        if (new_fd == -1) {
            perror("accept failed");
            continue;
        }
        printf("New client connected!\n");

        // 先接收客户端的请求信号(空格)
        char req_char;
        ssize_t req_bytes = recv(new_fd, &req_char, 1, 0);
        if (req_bytes <= 0) {
            perror("recv request failed or client disconnected");
            close(new_fd);
            continue;
        }

        // 判断是不是约定的空格信号
        if (req_char == ' ') {
            // 生成时间戳
            time_t now = time(NULL);
            char *timestamp = ctime(&now);
            // 发送给客户端
            send(new_fd, timestamp, strlen(timestamp), 0);
            printf("Sent timestamp to client.\n");
        } else {
            // 可选:返回错误提示
            const char *err_msg = "Invalid request! Only spacebar is allowed.\n";
            send(new_fd, err_msg, strlen(err_msg), 0);
            printf("Received invalid request from client.\n");
        }

        close(new_fd);
    }

    close(sockfd);
    return 0;
}
一些新手注意事项
  • 编译时记得加-Wall参数,比如gcc tcp-demo-client.c -o client -Wall,能帮你发现潜在的小问题;
  • 测试时先启动服务器,再启动客户端,按空格键就能看到时间戳啦;
  • 如果遇到recv或send返回错误,用perror能看到具体原因,比如连接断开、权限问题之类的;
  • 要是想更严谨,可以用字符串(比如"GET_TIMESTAMP")代替空格作为请求信号,逻辑和上面一样,只是把发送/接收的字符换成字符串,用strcmp判断就行。

内容的提问来源于stack exchange,提问作者Codefactory

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:52:14