网络通信常见问题

本文详细介绍了网络通信中的各种问题,包括socket流程、长连接与短连接的区分,以及常见问题如socket不够、长连接请求混乱、SIGPIPE信号处理等。还提供了相应的解决方案,如设置SO_LINGER选项、使用TCP_NODELAY、调整select限制等,帮助优化网络程序的性能和稳定性。
摘要由CSDN通过智能技术生成

转自:http://blog.csdn.net/wzhwho/article/details/6169620

 

一、socket流程

socket 是面向客户/服务器模型而设计的,

针对客户和服务器程序提供不同的socket 系统调用

二、长连接和短连接
长连接:在多次请求中保持连接,使用同一个连接处理多次请求,直至出现错误或者异常才断开,并重新建立新的连接。
一般通过服务器端的长时间的读超时和客户端重用连接来实现。
典型例子:ui->as  as->bs
短连接:每个请求建立一个连接,请求处理完成,则断开连接。
一般服务器端使用短的读超时。
典型例子:browser->apache  client->LDC
ependingpoll同时支持长连接和短链接
三、常见问题
1.socket不够
大压力短连接,出现大量close_wait
解决方法:
lg.l_onoff = 1;
lg.l_linger = 0;
setsockopt(svrsock->sock, SOL_SOCKET, SO_LINGER,  (const char*)&lg, sizeof(lg));

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);
       if (client > 0)     
               setsockopt(client, IPPROTO_TCP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值