因为Connection reset by peer这个错误是与网络/TCP协议相关,
所以对于他的诊断, 无论是java还是.net, 等等都适用.
具体到这个例子, 我们是一个sap系统, dev_disp里面有一条形如下面这样的log
*** ERROR => NiIRead: SiRecv failed for hdl 17/sock 2420
(SI_ECONN_BROKEN/10054; I4; ST; P=10.50.XXX.XXX:3900; L=10.50.XXX.XXX:XXXXX) [nixxi.cpp 5087]
*** ERROR => MsINiRead: NiBufReceive failed (NIECONN_BROKEN) [msxxi.c 2829]
*****************************************************************************
*
* LOCATION SAP-Dispatcher XXX on host XXX
* ERROR Reading data from the message server (XXX / 3900)
* failed.
* Please check the trace file of the message server.
*
* TIME Sun Apr 21 11:38:00 2013
* RELEASE 720
* COMPONENT MS (message handling interface, multithreaded)
* VERSION 4
* RC -36
* MODULE msxxi.c
* LINE 2848
* COUNTER 12
*
*****************************************************************************
显然, 出了一个叫做10054: WSAECONNRESET: Connection reset by peer的错误.
那么什么是Connection reset by peer呢?
简单的说, 如果两个地址A和B他们在进行TCP通信, 如果A说他遇到了一个Connection reset by peer的问题, 那么着意味着, 他收到了一个B发给他的一个叫做RST的控制位. 或者B没有按照协议中定义的,正常的握手方法结束会话, 而是被强制或者异常终止.
那么什么时候, 为了什么B要给A发一个RST控制字符呢?
简单的说, 当B认为自己遇到了一些无法恢复的错误时.
具体的话, 可以参照TCP协议标准RFC 793,
如果你和我一样, 有刨根问底的"坏习惯的话", 我还推荐你看下面这两个链接.
这两个连接中对RST有更详细的阐述.
他们还解释了诸如, 为什么一个abnormal close(也叫slamming the connection shut)将会导致一个RST?
为什么一个连接都被关闭, 或者异常终止了他还会发出RST(实际是TCP stack所为)?, 等等问题.
RST - tracing @WireShark
Winsock Programmer’s FAQ: Debugging TCP/IP
既然这是一个tcp的error, 所以, 不仅仅是sap, 对于java,.net也同样适用,
只要出现了这个错误, 如果不是明显程序的bug, 那么从网络方面查查, 总是明智的选择.
关于这个错误提示信息, 可以参考这个note:
SAP note 1519484
这个note里面也有提到, 某些防火墙设置, 也会导致这个错误,
比如, 某些防火墙, 我们可以配置, 在检测到一些连接, 超过一定时间没有发生通信时,
会对这个连接的双方做timeout处理, 比如给双方发一个RST控制位.
这也是为什么很多程序都有keepalive的功能与配置.
ps. 我并不是防火墙的专家, 所以更详细的内容请自行google
但在我调查的范围, 上述情况并不是防火墙发送RST的唯一原因,
而且不同的防火墙软件也通常都具备不同的功能,
但是从理论上讲, 如果我想拒绝, 阻塞或者中断一个连接的话, 我都可以发送一个RST控制位.
(这听起来和防火墙做的事情有点像...)
下面是SCN上面的一些连接(第一个连接, 提问者声称通过调整网络, 基本解决了这个问题):
http://scn.sap.com/message/6467523
http://scn.sap.com/thread/1571790
https://scn.sap.com/thread/1295138
下面是关于这个error的其他的一些连接.
同样, 在第一个连接里面, 也有人声称, 他也通过调整firewall设置(这些设置会影响网络), 解决了这个问题.
http://www.sapfans.com/forums/viewtopic.php?f=12&t=90143
http://stackoverflow.com/questions/1434451/what-does-connection-reset-by-peer-meanhttp://www.saptechies.com/winnt-connection-reset-by-peer/
http://h30499.www3.hp.com/t5/Networking/10054-WSAECONNRESET-Connection-reset-by-peer/td-p/3436931
相关推荐
#### WSAECONNRESET (10054): Connection reset by peer. - **含义**:存在的连接被远程主机强制关闭。这种情况可能发生在远程主机上的应用程序突然停止运行、远程主机重启或远程方套接字上使用了“强制”关闭等...
26. WSAECONNRESET(code:10054):远程主机主动断开了连接。 27. WSAENOBUFS(code:10055):系统缓冲区空间不足,无法执行Socket操作。 28. WSAEISCONN(code:10056):尝试连接一个已经连接的Socket。 29. ...
26. WSAECONNRESET (10054):该错误码表示连接被重置。 27. WSAENOBUFS (10055):该错误码表示缓冲区不足。 28. WSAEISCONN (10056):该错误码表示已经连接。 了解这些错误码可以帮助开发者更好地处理网络错误和...
- **WinSock错误代码**:如WSAEINTR、WSAEWOULDBLOCK、WSAECONNRESET等,每个错误代码都有特定含义,帮助开发者定位和解决问题。 - **异常处理**:使用`WSAGetLastError`获取最近的WinSock错误代码,结合错误码...
golang.org/x/sys/windows
- **WSAECONNRESET (10054)**:远程主机强制关闭了连接。这通常是因为远程主机突然断开连接。 - **WSAENOBUFS (10055)**:没有可用缓冲区空间。这意味着系统没有足够的内存来满足请求。 - **WSAEISCONN (10056)**:...
错误处理是网络编程中不可或缺的一部分,书中会阐述如何捕获和处理Winsock相关的错误,如WSAECONNRESET、WSAETIMEDOUT等,以及如何编写健壮的网络应用程序。 除此之外,书中的源代码部分将提供实际的示例,帮助读者...
2. **连接(Connection)与监听(Listening)**:对于TCP套接字,服务器端需要先调用`bind()`函数绑定一个本地端口号,然后用`listen()`函数开始监听连接请求。客户端则使用`connect()`函数尝试建立到服务器的连接。...
8. **错误处理**:在Winsock编程中,需要处理各种网络错误,如WSAEWOULDBLOCK(操作将阻塞)、WSAECONNRESET(连接被远程主机重置)等。 9. **关闭和清理**:通信完成后,使用`closesocket()`函数关闭套接字,释放...
2. 错误处理:捕获并处理可能的网络错误,如`ECONNREFUSED`(连接被拒绝)、`WSAECONNRESET`(连接被远程主机重置)等。 3. 多线程或异步处理:为了保证用户界面的响应性,可以使用多线程或者异步I/O(如Windows的...
7. **错误处理**:Winsock2提供了丰富的错误代码,如WSAECONNRESET、WSAEWOULDBLOCK等,可以帮助开发者诊断并解决网络编程中遇到的问题。 8. **套接字选项**:`setsockopt`和`getsockopt`函数允许设置或获取套接字...
1. **Winsock错误码**:Winsock API调用可能失败并返回错误码,如WSAECONNRESET表示连接被远程主机重置。 2. **异常处理**:良好的网络程序应包含异常处理机制,以优雅地处理网络错误。 **五、套接字选项与控制** ...
在MFC中,我们可以使用消息映射机制来处理CAsyncSocket的异步消息,例如SOCKET_ERROR消息,用于处理错误,以及WSAECONNRESET消息,用于检测断开连接的情况。 **文件结构:** - **TALK_Client**:这个文件夹可能包含...
- **错误码**:Winsock API调用失败会返回错误码,如WSAECONNRESET表示连接被重置,WSAEWOULDBLOCK表示操作将阻塞。 - **调试技巧**:使用`WSAGetLastError()`获取最近一次错误代码,配合`WSASYSINFO`结构获取系统...
Winsock提供了错误代码,如WSAECONNRESET、WSAEWOULDBLOCK等,通过`WSAGetLastError`获取。良好的错误处理机制能确保程序在遇到问题时能够恢复或优雅地退出。 五、高级主题 1. 异步I/O:`WSAAsyncSelect`和`...
5. **错误处理**:讲解了常见的错误代码,如WSAEWOULDBLOCK、WSAECONNRESET等,以及如何通过WSAGetLastError()获取错误信息。 6. **多线程与并发**:在多线程环境下如何同步和管理套接字操作,可能涉及互斥量、条件...
- 在Winsock编程中,错误检查至关重要,常见的错误代码如WSAECONNRESET、WSAEWOULDBLOCK等需要适当地处理。 - VC6的调试器可以用来追踪代码执行,查看内存状态,以及设置断点,帮助找出程序中的问题。 通过深入...
常见的错误如WSAECONNRESET(连接被远程主机重置)或WSAEWOULDBLOCK(操作现在将阻塞)。 6. **ping方法**: 在源码中可能包含实现ping功能的示例。Ping是ICMP协议的一个应用,用于检查网络可达性和延迟。在...
- Winsock使用错误代码,如WSAECONNRESET表示连接被重置。 - `WSAGetLastError()`获取最近的错误代码,`WSAErrorString()`将其转换为可读字符串。 ### 10. 高级特性 - **多线程**: 在多个线程中使用Winsock,需要...