1.网络编程基本模型介绍
linux的网络编程有很多种写法,最简单的是阻塞式(Blocking)的网络程序,其次有非阻塞(Non-Blocking),多路复用(Multiplexing),异步(Asynchronous)模型等。
1.1. 阻塞模型
阻塞模型是最为简单的一种网络编程模型。顾名思义,该模型中,socket都工作在阻塞模式下,在调用相应的网络函数时,如accept, recv, send时,这些函数都会阻塞线程,直到socket可读或者可写,或者出错时,线程才会继续执行。
举一个例子,一个服务器端程序,监听端口后,等待连接进入:
// 省略了socket创建、端口绑定bind的代码
if (listen(sock, 10) < 0)
{
//监听端口时出错,给出错误信息后退出
printf("listen socket error: %s(errno: %d)\n", strerror(errno), errno);
exit(0);
}
//监听成功,准备接收连接
bool bRun = true;
while (bRun)
{
// 接收连入的连接
sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
socklen_t sin_size = sizeof(sockaddr_in);
// 这里的accept调用会阻塞线程,直到有连接连入,(1)
int fd = accept( sock, (sockaddr *)&am