然而,我们必须保持清醒,这样的方法在一些服务器设计中会产生新的问题。当在close函数调用上将SO_LINGER选项配置为超时(linger),当我们的服务器在close函数调用中执行超时时会阻止其他的客户端进行服务。如果我们正在一个进程中服务多个客户端进程时就会存在这个问题。使用默认的行为也许更为合适,因为这允许close函数立即返回。而任何未发送的数据也会为内核继续发送。
最后,如果程序或是服务器知道连接应何时中止时可以使用中止行为。这也许适用于当服务器认为没有访问权限的用户正试着进行访问的情况。这种情况下的客户并不会得到特别的关注。
下面的代码是一个使用SO_LINGER选项的例子,使用30秒的超时时限:
#define TRUE 1
#define FALSE 0
int z; /* Status code
*/ int s; /* Socket s */
struct linger so_linger;
...
so_linger.l_onoff = TRUE;
so_linger.l_linger = 30;
z = setsockopt(s,
SOL_SOCKET,
SO_LINGER,
&so_linger,
sizeof so_linger);
if ( z )
perror("setsockopt(2)");
下面的例子显示了如何设置SO_LINGER的值来中止套接口s上的当前连接:
#define TRUE 1
#define FALSE 0
int z; /* Status code */
int s; /* Socket s */
struct linger so_linger;
...
so_linger.l_onoff = TRUE;
so_linger.l_linger = 0;
z = setsockopt(s,
SOL_SOCKET,
SO_LINGER,
&so_linger,
sizeof so_linger);
if ( z )
perror("setsockopt(2)");
close(s); /* Abort connection */
在上面的这个例子中,当调用close函数时,套接口s会立即中止。中止的语义是通过将超时值设置为0来实现的。
设置SO_KKEPALIVE选项
当使用连接时,有时他们会空闲相当长的时间。例如,建立一个telnet会话通过访问股票交易服务。他也许会执行一些初始的查询,然后离开连接而保持服务打开,因为他希望回来查询更多的内容。然而,同时连接处理空闲状态,也许一次就是一个小时。
任何一个服务器认为他有一个连接的客户时会为其分配相应的资源。如果服务器是一个派生类型(fork),那么整个Linux进程及其相应的内存都分配给这个客户。如果事情顺利,这个场景并不会产生任何问题。然而当出现网络崩溃时,困难出现了,我们所有的578个客户都会从我们的股票交易服务中失去连接。
在网络服务恢复后,578个客户会试着连接到我们的服务器,重建连接。这对于我们来说是一个真实的问题,因为我们的服务器在之前并没有意识到他失去了空闲客户--SO_KKEPALIVE来解决这个问题。
下面的例子显示了如何在套接口s上使用SO_KKEPALIVE选项,从而一个断开的空闲连接可以被检测到:
#define TRUE 1
#define FALSE 0
int z; /* Status code */ int s; /* Socket s */
int so_keepalive;
...
so_keepalive = TRUE;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-49663-8.html
这样的“优质资源”当然他自己享受了
你可以不同意他的观点
打