最近在做Socket网络编程相关的项目,因此在此记录下一些心得体会吧! 关于基于Socket的网络编程,一般指的是开发基于C/S模式的网络程序。由于有多线程的处理,例如开发一个高性能的服务器,难度不低,我在做一个基于自定义协议的文件下载的服务器以及客户端的时候,遇到的问题确实很多,也正如某人在网上所说,10054,10053的错误的原因是最难找的,特别是涉及多线程处理的时候。现在就在这个问题的困惑中,具体原因实在不敢肯定,现象也有些怪异,服务器在多线程提供下载文件的时候,在send文件信息时,会出现个别10054错误,客户端也是多线程下载,但是并非10054表明的一样,客户端并没有关掉Socket,下载线程也没有退出,经过检查是down在recv函数上,这样就有些无法解释,明明客户端的连接保持着,服务器却出现10054!!!,
先说下10054错误的官方原因: WSAECONNRESET(10054)Connection reset by peer. 存在的连接被远程主机强制关闭。通常原因为:远程主机上对等方应用程序突然停止运行,或远程主机重新启动,或远程主机在远程方套接字上使用了“强制”关闭(参见 setsockopt(SO_LINGER))。另外,在一个或多个操作正在进行时,如果连接因“keep-alive”活动检测到一个失败而中断,也可能导致此错误。此时,正在进行的操作以错误码 WSAENETRESET失败返回,后续操作将失败返回错误码 WSAECONNRESET。
这样的解释并不合理,我能想到的原因是:服务器send速度太快,客户端接受太慢,但是也没有任何资料说明会引发10054错误,但是经过在send之前或后Sleep(200)后,就不会出现这个错误,但是这样的解决方案,大幅度降低了服务器的性能,非常的不可取!目前还在查找原因,着手与多线程的处理吧!
Socket的网络编程
最新推荐文章于 2024-05-06 17:30:00 发布