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

图中可对应的 Unix C 函数:
示例代码
进阶 TCP 模型
1. 循环服务器
c
sfd = socket();
bind();
listen();
while(1) {
newfd = accept();
while(1) {
recv(); send();
}
close(newfd);
}
close(sfd);特点:进来一个连接服务一个连接,无法同时服务多个客户端。
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) 不能定义成全局,线程之间共享资源,会被新的连接覆盖