思考:
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 就要等待足够的数据到来。而在用户进程这边,整个进程

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

被折叠的 条评论
为什么被折叠?



