本节我们讲述一下ngx_send.c文件,其主要用于向TCP socket发送一段连续的内存数据。
1. os/unix/ngx_send.c源文件
下面对ngx_unix_send()函数做一个简单的解释:
1) 对kqueue情形下pending_eof的处理
我们当前不支持NGX_HAVE_KQUEUE
。在kqueue模型下,wev->pending_eof表示当前socket 连接已经关闭,但是当前还未被处理。
2) 函数send()发送数据
n = send(c->fd, buf, size, 0);
根据返回值n做不同的处理:
- 返回值>0: 返回发送的字节数,如果
n < size
,将wev->ready置为0,表示socket未准备好(如发送缓存区已满)
此种情况下,有两种特例: NGX_EAGAIN
以及NGX_EINTR
。
NGX_EINTR
这种情况是受到信号中断的影响,一般重新发送即可。对于NGX_EAGAIN
一般表示当前尚未准备好数据的发送,可能需要再等待一段时间以使socket就绪(此种情况一般并不表示真正出错)。