Loading

笔记: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);
}

🥈 客户端实现

等待补充...

🔨 原型

posted @ 2023-11-01 16:59  MINtc  阅读(156)  评论(0)    收藏  举报