笔记:C 语言多线程TCP基础
📃 目录
🎃 环境
- 编译器 msys2
- 编辑器 redpanda dev
- 系统 Windows 10 21H2
🥇 服务端实现
创建基本TCP服务器
int main() {
// 初始化 winsock2
// 创建 socket
// 绑定 socket
// 监听 socket
pthread_mutex_init(&mutex, NULL); // 初始化线程互斥锁
while(1) {
// 多线程接收所有客户端请求
}
// 关闭 socket
closesocket(socket);
// 清理套接字
wsacleanup();
// 结束
return 0;
}
多线程接收客户端消息
pthread_t threadHandle; // 此变量定义在main函数内
pthread_mutex_t mutex; // 此变量需要定义成全局变量
struct sockaddr_in cli_addr; // 客户端连接信息
SOCKET con_fd; // 客户端描述符
memset(&cli_addr, 0, sizeof(cli_addr)); // 初始化内存
// 循环接受客户端连接
while(1) {
// 接收客户端
con_fd = accept(ser_fd, (struct sockaddr*)&cli_addr, sizeof(cli_addr));
if(con_fd == INVALID_SOCKET) {
printf_s("accept error\n");
continue; // 不要直接跳出循环继续执行
}
printf_s("accept socket %d success\n", (int)con_fd);
// 锁定 阻塞线程
pthread_mutex_lock(&mutex);
// 创建一个线程专门处理一个客户端的接收和发送
int pthreadId = pthread_create(&threadHandle, NULL, (void*)rs_handle, (void*)&con_fd);
if(pthreadId < 0) {
printf_s("thread create error\n");
continue;
}
// 清除内存
memset(&cli_addr, 0, sizeof(cli_addr));
}
rs_handle函数
void rs_handle(SOCKET* con_fd) {
char buff[1000]; // 接收消息缓冲区
int count = 0; // 接收字符计数
SOCKET connect_fd = *(SOCKET*)con_fd; // 取出创建线程时的传值
pthread_mutex_unlock(&mutex); // 解锁 取消线程阻塞继续执行
memset(buff, 0, sizeof(buff)); // 初始化缓冲区
// 接收数据 (如果数据量为负数则认为客户端已断开)
while((count = recv(connect_fd, buff, sizeof(buff), 0)) > 0) {
// 打印接收到的消息
printf_s("socket %d say: %s\n", (int)connect_fd, buff);
// 清空缓冲区以准备接收下一条数据
memset(buff, 0 ,sizeof(buff));
}
// 断开客户端连接
closesocket(connect_fd);
}
🥈 客户端实现
等待补充...

浙公网安备 33010602011771号