socket:read: Connection reset by peer
推薦文章:https://winddoing.github.io/post/33577.html#%E8%BF%94%E5%9B%9E%E5%80%BC-n-x3D-x3D-0
推薦文章:https://blog.csdn.net/hguisu/article/details/38700899
今天線上服務器報錯 Connection reset by peer ,為了一探究竟,所以來復現一下當時的場景。
示例代碼
server 偽代碼
server.listen("127.0.0.1",1234) clientSock = server.accept() whilt true{msg = clientSock.recv()print(msg)sleep(1)serverMsg = "server say" + rand.int()clientSock.send(serverMsg) }client偽代碼
sock = createSocket() sock.connect("127.0.0.1",1234) while true{clientMsg = "client say" + rand.int()sock.send(clientMsg)sleep(2)msg = sock.recv()print(msg) }執行結果
具體代碼有不同實現方式,但是過程都是上面的形式,我這里使用lua調用底層c++。
server
client
服務器先開起來,然后客戶端連接上去,在服務器調用完send之后,立刻把server進程殺掉。
這個時候執行send把數據發送到tcp待發送緩沖區中,接下來client執行 recv方法的時候就會報錯 Connection reset by peer。
Wireshark抓包驗證
使用Wireshark進行抓包,可以看到在1584處向server發送了 ctl+c 命令,殺掉了進程,那么這是進程就交由Linux 0號進程管理(所有進程的父進程);0號進程對其進行資源回收,向client發送了 FIN 結束請求,收到client ACK 回復之后 server最后向client socket發送了 RST 消息,此時客戶端再去 recv 的時候就會報 “socket:read: Connection reset by peer” 錯誤。
TCP RST消息的三種情況:
RST一般是在FIN之后才會出現為1的情況,表示的是連接重置。
總結
以上是生活随笔為你收集整理的socket:read: Connection reset by peer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统-进程调度
- 下一篇: form表单提交且接口回调显示提交成功