高性能网络服务器--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、调用进程将甩开终端。

时间: 2024-12-29 09:55:19

高性能网络服务器--SO_LINGER选项 会话创建的相关文章

setsockopt 设置 SO_LINGER 选项

setsockopt 设置 SO_LINGER 选项 最近和后台的server通信 server发现在读数据的时候  客户端已经关闭连接 ,也就是 没有等服务器读完数据,客户端已经fclose了, 联调以后的发现需要设置这个选项: so_linger 此选项指定函数close对面向连接的协议如何操作(如TCP).内核缺省close操作是立即返回,如果有数据残留在套接口缓冲区中则系统将试着将这些数据发送给对方. SO_LINGER选项用来改变此缺省设置.使用如下结构: struct linger

关于SO_LINGER选项的使用

结论: linux开启SO_LINGER时,如果设置l_linger为非0, 不管是阻塞socket,非阻塞socket, 在这里都会发生阻塞, 而并不是UNP所讲到的( 非阻塞socket会立即返回EWOULDBLOCK) 测试结果见这里 https://www.nybek.com/blog/2015/03/05/cross-platform-testing-of-so_linger/ 说明: close的行为受SO_LINGER选项影响 1.默认情况 l_onoff = 0 l_linger

基于 libevent 开发的 C++ 11 高性能网络服务器 evpp

evpp是一个基于libevent开发的现代化C++11高性能网络服务器,自带TCP/UDP/HTTP等协议的异步非阻塞式的服务器和客户端库. 特性: 现代版的C++11接口 非阻塞异步接口都是C++11的functional/bind形式的回调仿函数(不是libevent中的C风格的函数指针) 非阻塞纯异步多线程TCP服务器/客户端 非阻塞纯异步多线程HTTP服务器/客户端 非阻塞纯异步多线程UDP服务器 支持多进程模式 优秀的跨平台特性和高性能(继承自libevent的优点) 除此之外,基于

TCP协议中的SO_LINGER选项

TCP协议中的SO_LINGER选项 SO_LINGER选项用来设置延迟关闭的时间,等待套接字发送缓冲区中的数据发送完成.没有设置该选项时,在调用close()后,在发送完FIN后会立即进行一些清理工作并返回.如果设置了SO_LINGER选项,并且等待时间为正值,则在清理之前会等待一段时间. 以调用close()主动关闭为例,在发送完FIN包后,会进入FIN_WAIT_1状态.如果没有延迟关闭(即设置SO_LINGER选项),在调用tcp_send_fin()发送FIN后会立即调用sock_or

事件日志ID 2511:服务器服务无法重新创建 &lt;sharename&gt; 共享关系,因为 &lt;address&gt; 目录已不再存在

服务器服务无法重新创建 QQMusicDownload 共享关系,因为 D:\QQMusic\QQMusicDownload 目录已不再存在.请运行 "net share QQMusicDownload /delete" 来删除此共享,或重新创建目录 D:\QQMusic\QQMusicDownload. 在 net share 和 fsmgmt.msc 中无此共享. 解决办法:删除 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\service

该文件没有程序与之关联来运行该操作。请在控制面板的目录选项中创建关联 解决代码

打开控制面板-目录选项,或者打开随意一个目录,在菜单条--工具--目录选项 1.切换到文件类型选项卡,在以注冊的文件类型中找到要打开的文件类型 2.选中后点击以下的"高级"按扭 3.在弹出的对话框中的操作一栏里选择一个操作(相应该类文件右键菜单上的命令),然后点编辑 4.在弹出的对话框中点击"浏览"按扭,找到要打开该文件的程序 假设在第1步中找不到WMV,能够点击"新建"按扭 5.在弹出的对话框中输入要打开的文件类型,确定,到第1步 假设在第3步

windows 模拟用户会话创建进程

在渗透当中,经常会碰到这样的问题.一个机器,机器上好几个用户,或者域内,想让某个机器的某个会话执行你想要执行的程序,或者中马,以当前会话来上线. 现在模拟如下的一个情况: 严格的DMZ,内网-->Dmz,而dmz->X<-内网. 而DMZ的服务器上有好几个会话,我们可以通过模拟用户登录来创建进程,看DMZ服务器上的其他会话用户是否存在一些连接情况,从而进一步分析. 环境测试如下: windows 2008 64位,机器上2个会话.已获取WEBSHELL. A用户:Administrato

android 客户端与服务器 保持同一会话的session

最近在开发项目的过程中,遇到android与web服务器要在同一session下通信的问题. 在解决问题前先回顾下Session与Cookie: Cookie和Session都为了用来保存状态信息,都是保存客户端状态的机制,它们都是为了解决HTTP无状态的问题而所做的努力. Session可以用Cookie来实现,也可以用URL回写的机制来实现. Cookie和Session有以下明显的不同点: 1)Cookie将状态保存在客户端,Session将状态保存在服务器端: 2)Cookies是服务器

PHP中的session会话创建打印释放销毁;

PHP Session PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置.Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的. PHP Session 变量 您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它.这很像一次对话(Session).计算机知道您是谁.它清楚您在何时打开和关闭应用程序.然而,在因特网上问题出现了:由于 HTTP 地址无法保持状态,Web 服务器并不知道您是谁以及您做