转自:http://blog.csdn.net/wzhwho/article/details/6169620
一、socket流程
socket 是面向客户/服务器模型而设计的,
针对客户和服务器程序提供不同的socket 系统调用
二、长连接和短连接
长连接:在多次请求中保持连接,使用同一个连接处理多次请求,直至出现错误或者异常才断开,并重新建立新的连接。
一般通过服务器端的长时间的读超时和客户端重用连接来实现。
典型例子:ui->as
短连接:每个请求建立一个连接,请求处理完成,则断开连接。
一般服务器端使用短的读超时。
典型例子:browser->apache
ependingpoll同时支持长连接和短链接
三、常见问题
1.socket不够
大压力短连接,出现大量close_wait
解决方法:
lg.l_onoff = 1;
lg.l_linger = 0;
setsockopt(svrsock->sock, SOL_SOCKET, SO_LINGER,
2.长连接请求混乱
长连接请求错乱,收到其他线程的请求
导致原因:在长连接出错的情况下,并没有关闭连接
3.SIGPIPE信号
向断开(半关闭)的连接中write数据时产生
通常处理方式:
signal(SIGPIPE, SIG_IGN);
SIGPIPE信号被忽略
4.TCP_NODELAY
TCP_NODELAY 不使用Nagle算法,不会将小包进行拼接成大包再进行发送,直接将小包发送出去,会使得小包时候用户体验非常好。
如果没有TCP_NODELAY在压力的情况下,会有延时(40ms)
Ependingpool自己默认的accept函数没有将socket设置成TCP_NODELAY.需要自己写回调函数来控制。
加入如下语句
client = ul_accept(sock, (struct sockaddr *)&sin, &slen);