日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

socket:read: Connection reset by peer

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,同時RST報文接收通告窗口大小為0。其實客戶端向服務器的某個端口發起連接,如果端口被處于TIME_WAIT 狀態的連接占用時,客戶端也會收到RST
  • 異常終止連接。一方直接發送RST報文,表示異常終止連接。一旦發送方發送復位報文段,發送端所有排隊等待發送的數據都被丟棄。應用程序可以通過socket選項SO_LINGER來發送RST復位報文。
  • 處理半打開連接。一方關閉了連接,另一方卻沒有收到結束報文(如網絡故障),此時另一方還維持著原來的連接。而一方即使重啟,也沒有該連接的任何信息。這種狀態就叫做半打開連接。而此時另一方往處于半打開狀態的連接寫數據,則對方回應RST復位報文。
  • RST一般是在FIN之后才會出現為1的情況,表示的是連接重置。

    總結

    以上是生活随笔為你收集整理的socket:read: Connection reset by peer的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。