网络IO管理-简单一问一答、多线程方式

本文介绍了网络IO管理中的简单一问一答服务器模型和多线程方式。针对阻塞IO,阐述了在等待数据和拷贝数据阶段的阻塞情况,并通过代码展示了C++开发中的应用。同时,讨论了多线程在处理网络请求时的优缺点,以及在面临大量连接时,如何利用线程池或连接池来优化资源管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思考:

1. 那网络中进程之间如何通信,浏览器的进程怎么与web服务器通信的?

2. 什么时候用一请求一线程的方式?

3. 什么时候用select/poll?

4. 什么时候用epoll?

准备工作

下面展示socket几个常用的函数listenfd, bind, listen, accept具体作用。

// 聘请迎宾的小姐姐
if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    printf("create socket error: %s(errno: %d)\n", strerror(errno), errno);
    return 0;
}

// 迎宾的小姐姐在哪个门口工作
if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
        printf("bind socket error: %s(errno: %d)\n", strerror(errno), errno);
        return 0;
}

// 小姐姐正式走到门口开始迎宾
if (listen(listenfd, 10) == -1) {
   	printf("listen socket error: %s(errno: %d)\n", strerror(errno), errno);
   	return 0;
}

// 把客户带到大厅介绍一个服务员,coonfd就是服务员
if ((connfd = accept(listenfd, (struct sockaddr *)&client, &len)) == -1) {
	printf("accept socket error: %s(errno: %d)\n", strerror(errno), errno);
    return 0;
}

网络连接的简单过程

网络IO模型

阻塞IO

1. 简单一问一答服务器/客户机模型

   当用户进程调用了 read 这个系统调用,kernel 就开始了 IO 的第一个阶段:准备数据。对于network io 来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的数据包),这个时候 kernel 就要等待足够的数据到来。而在用户进程这边,整个进程会被阻塞。当 kernel一直等到数据准备好了它就会将数据从 kernel 中拷贝到用户内存,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值