TCP 的逻辑实现,可以和客户端连接发送数据

This commit is contained in:
2026-03-04 10:29:20 +08:00
parent f32d91c424
commit f45b571162
16 changed files with 14027 additions and 2 deletions

53
src/remoteDisplay.c Normal file
View File

@@ -0,0 +1,53 @@
/*
* remoteDisplay.c - TCP 服务器线程实现
* 逻辑等待客户端连接循环接收消息并原样回发echo直到客户端断开或主线程请求退出
*/
#include <stdio.h>
#include <string.h>
#include "TCP/tcp.h"
#include "remoteDisplay.h"
void tcp_server_thread_fn(void* arg)
{
server_thread_arg_t* ctx = (server_thread_arg_t*)arg; /* 强转为参数结构体 */
int server_sock = TcpServer_Listen((uint16_t)ctx->port); /* 在指定端口创建监听 socket */
if (server_sock == TCP_INVALID_SOCKET) { /* 监听失败(端口占用或权限等) */
fprintf(stderr, "[TCP Server] TcpServer_Listen(%d) failed\n", ctx->port);
return; /* 线程直接退出,主线程通过 server_sock 仍为 INVALID 可知失败 */
}
*ctx->p_server_sock = server_sock; /* 回写监听 socket主线程可用来关闭以结束 Accept 阻塞 */
printf("[TCP Server] 监听端口 %d等待客户端连接...\n", ctx->port);
char recv_buf[1024]; /* 接收缓冲区,用于收客户端数据并回发 */
while (!*ctx->p_quit) { /* 主线程未请求退出时一直循环 */
int client = TcpServer_Accept(server_sock); /* 阻塞等待一个客户端连接 */
if (client == TCP_INVALID_SOCKET) { /* Accept 失败(含:主线程已关闭 server_sock */
if (*ctx->p_quit) /* 若是因退出请求导致,则跳出循环 */
break;
continue; /* 否则忽略本次错误,继续下一次 Accept */
}
printf("[TCP Server] 客户端连接成功\n");
/* 只要该客户端还连着,就循环等待消息并回发 */
while (!*ctx->p_quit) {
printf("[TCP Server] 等待客户端消息\n");
memset(recv_buf, 0, sizeof(recv_buf));
int n = TcpClient_Recv(client, recv_buf, sizeof(recv_buf) - 1);
if (n > 0) {
printf("recv: %s\n", recv_buf);
TcpClient_Send(client, recv_buf, (size_t)n);
} else {
/* n==0 表示对方关闭连接n<0 表示出错,退出本连接循环 */
printf("[TCP Server] 客户端关闭连接\n");
break;
}
}
TcpClient_Close(client);
}
TcpServer_Close(server_sock); /* 关闭监听 socket */
*ctx->p_server_sock = TCP_INVALID_SOCKET; /* 通知主线程 socket 已关闭,避免重复 Close */
printf("[TCP Server] 已退出\n");
}