Skip to content
On this page

TCP模型图


标签:linux/network  

如图是一个 tcp 的 cs 架构的基本模型

invert

图中可对应的 Unix C 函数:

示例代码

📋TCP服务器客户端示例代码

进阶 TCP 模型

1. 循环服务器

c
sfd = socket();
bind();
listen();
while(1) {
  newfd = accept();
  while(1) {
    recv(); send();
  }
  close(newfd);
}
close(sfd);

特点:进来一个连接服务一个连接,无法同时服务多个客户端。

2. 并发服务器

  1. 可以同时处理多个客户端的请求(交互请求,连接请求),需要创建子进程/分支线程来处理;
  2. 父进程/主线程只负责连接

2.1 多进程并发服务器

c
/* 多进程 TCP 服务器模型 */
void handler(int sig) {
  /* 回收僵尸进程 */
  while(waitpid(-1, NULL, WNOHANG) > 0);
}

/* 主函数 */
signal(SIGCHLD, handler):
sfd = socket();
bind();
listen();
while (1) {
  newfd = accept();
  if (0 == fork()) {
    close(sfd);
    while (1) {
      recv(); send();
    }
    close(newfd);
    exit(0);
  }
  close(newfd);
}
close(sfd);

2.2 多线程并发服务器

c
/* 多线程 TCP 服务器模型 */
void * deal_cli_msg(void *arg) {
  int newfd = *(int*)arg;
  while(1) {
    recv(); send();
  }
  close(newfd);
  pthread_exit(NULL);
}

// main
sfd = socket();
bind();
listen();
while(1) {
  newfd = accept();
  pthread_create(&tid, NULL, 
                 deal_cli_msg, &newfd);
  pthread_detach(tid);
}
close(sfd);

📣 newfd (socket) 和 cin (sockaddr_in) 不能定义成全局,线程之间共享资源,会被新的连接覆盖

Last updated: