当前位置: 技术问答>linux和unix
linux socket 通信中服务端并发问题,很急!!!
来源: 互联网 发布时间:2016-02-27
本文导语: 我写好了一个client 在arm9上跑,同事写了个server在win2000上跑,client往server发数据,服务端程序是阻塞式多线程实现,问题是:通信过程中,client会不明原因地自动结束(不明原因是只没任何提示),有的时候又可以看到如:connection...
我写好了一个client 在arm9上跑,同事写了个server在win2000上跑,client往server发数据,服务端程序是阻塞式多线程实现,问题是:通信过程中,client会不明原因地自动结束(不明原因是只没任何提示),有的时候又可以看到如:connection refused和 connection reset by peer.初步原因经查证为:
tcp 端口连接数逻辑上为256个,但是因为服务线程处理数据费时,速度比client连接慢,没及时断开连接.
我现在还迷惑的是:
1;即使服务器重置连接或拒绝连接,client也不应该会结束,因为我的client在连接传输过程中的每一步失败后都是continue,继续尝试.
2;服务端拒绝连接和重置连接这种情况有什么好的解决方法啊,不可能每次都要重启client吧,我增设了服务端tcp端口连接上限效果也一样.
tcp 端口连接数逻辑上为256个,但是因为服务线程处理数据费时,速度比client连接慢,没及时断开连接.
我现在还迷惑的是:
1;即使服务器重置连接或拒绝连接,client也不应该会结束,因为我的client在连接传输过程中的每一步失败后都是continue,继续尝试.
2;服务端拒绝连接和重置连接这种情况有什么好的解决方法啊,不可能每次都要重启client吧,我增设了服务端tcp端口连接上限效果也一样.
|
退出那样的循环要看你的writen函数怎么写的。重复的写循环是否在writen内部的(writen里也有一个while)
第一个办法是:SIGPIPE说明socket已被断开,你可以在handler里重新建立socket和重新connect(sockfd需要作为一个全局变量,使你在upload里也可以使用)。可能需要注意数据的完整性问题,因为当write时数据正在传输的话,可能某些数据丢掉了,那么你需要在重新建立连接后,知道哪些数据还没有发送。
第二个办法是:修改writen,在每一个真正的write(或send)函数之前调用select,这样做的好处是可以避免发生SIGPIPE,因为在贸然的write之前你已经知道socket不可用,从而重新建立连接,再次发送。这样也可以把循环控制在upload函数的上下文当中,而不是进入信号处理函数。信号处理函数执行时,程序一般是比较脆弱的。所以应该尽可能的避免在信号处理里写长的代码。
第一个办法是:SIGPIPE说明socket已被断开,你可以在handler里重新建立socket和重新connect(sockfd需要作为一个全局变量,使你在upload里也可以使用)。可能需要注意数据的完整性问题,因为当write时数据正在传输的话,可能某些数据丢掉了,那么你需要在重新建立连接后,知道哪些数据还没有发送。
第二个办法是:修改writen,在每一个真正的write(或send)函数之前调用select,这样做的好处是可以避免发生SIGPIPE,因为在贸然的write之前你已经知道socket不可用,从而重新建立连接,再次发送。这样也可以把循环控制在upload函数的上下文当中,而不是进入信号处理函数。信号处理函数执行时,程序一般是比较脆弱的。所以应该尽可能的避免在信号处理里写长的代码。
|
ethereal 抓包分析,问题应该很可能是在server端的