首页 > 代码库 > 高性能网络服务器--SO_LINGER选项 会话创建

高性能网络服务器--SO_LINGER选项 会话创建

SO_LINGER选项用于控制close系统调用在关闭TCP连接时的行为。在默认情况下,当说我们使用close系统调用关闭一个socket时,close立即返回,TCP模块负责把socket对应的TCP发送缓冲区中残留的数据发送给对方。

根据linger结构体中两个变量的不同值,会有三种不同的结果:

1、l_onoff==0 ,此时SO_LINGER选项不起作用,close用默认行为来关闭socket.

2、l_onoff != 0 && l_linger==0。此时close的行为取决于两个条件,一是被关闭的socket对应的TCP发送缓冲区中是否存在数据,二是该socket是阻塞还是非阻塞的。对于阻塞socket,close将等待一段l_linger的时间,直到TCP模块发送完所有残留数据并得到对方的确认,如果这段时间内TCP模块没有发送完残留数据并得到对方的确认,那么close系统调用将返回-1并设置errno为EWOULDBLOCK.如果socket是非阻塞的,close将立即返回,此时我们需要根据其返回值和errno来判断残留数据是否已经发送完毕。

二、 会话创建相关的API

      一些有关联的进程组将形成一个会话,下面的函数用于创建一个会话:

      #include <unistd.h>

       pid_t setsid(void);

      该函数不能有进程组的首领进程调用,否则将产生一个错误,对于非组首领的进程,调用该函数不仅创建新会话,而且如下额外的效果:

    1、调用进程成为会话的首领,此时该进程是新会话的唯一成员

     2、新建一个进程组,其PGID就是调用进程的PID,调用进程成为该组的首领

    3、调用进程将甩开终端。

高性能网络服务器--SO_LINGER选项 会话创建