TCP 的逻辑实现,可以和客户端连接发送数据
This commit is contained in:
53
src/remoteDisplay.c
Normal file
53
src/remoteDisplay.c
Normal 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");
|
||||
}
|
||||
Reference in New Issue
Block a user