C语言TCP Socket编程修改:客户端按空格后服务器发送时间戳
嘿,作为第一个Socket项目就尝试做交互功能,真的很不错!咱们把需求拆解一下:核心就是客户端主动触发请求(按空格键)→ 服务器收到请求后返回时间戳,分客户端和服务器两部分改就行,逻辑超清晰,我给你一步步讲:
第一步:修改客户端代码
原来的客户端是连接成功后直接等服务器发消息,现在要改成「等用户按空格键 → 给服务器发一个“我要时间戳”的信号 → 再接收服务器的回复」。
关键修改点:
- 连接成功后,提示用户按空格键;
- 监听键盘输入,直到用户按下空格键;
- 给服务器发送一个约定好的信号(新手用空格字符本身最直观);
- 然后再接收服务器返回的时间戳。
修改后的客户端核心代码片段:
#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; }
第二步:修改服务器代码
原来的服务器是连接成功后直接发时间戳,现在要改成「先接收客户端的请求信号 → 确认是约定的信号 → 再生成并发送时间戳」。
关键修改点:
- 接受客户端连接后,先等待接收客户端发来的信号;
- 判断收到的是不是约定的空格字符;
- 如果是,生成时间戳并发送;
- 处理接收失败或无效信号的情况。
修改后的服务器核心代码片段:
#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
相关产品推荐
相关产品推荐

