簡體   English   中英

確定TCP套接字的狀態

[英]Determine the state of a TCP socket

我開始學習如何在C ++中實現TCP服務器/客戶端(在Windows和Linux上)。 目前,我正在實現服務器(並以telnet作為客戶端進行測試)。 服務器應用程序像字符一樣發送和接收數據。(在理解所有服務器端之后,我將實現客戶端)。 但是我需要找到一種編程方式(C ++或OS API)來查詢TCP套接字狀態(ESTABLISHED,FIN_WAIT_2,CLOSE_WAIT等),而無需使用write()/ recv()來處理錯誤異常。

例如:

  1. 服務器啟動,綁定套接字並等待連接
  2. 客戶端啟動並在服務器上連接
  3. 在這里,我在服務器上使用了函數“ ioctlsocket(socket,FIONREAD,pbytes_available)”來確定何時讀取數據。
  4. 如果客戶端發送一些數據,則“ pbytes_available”將大於1,並且服務器使用recv()進行獲取。
  5. 如果客戶端沒有發送任何內容,則服務器可以執行其他任務,並在下一個循環中檢查套接字上是否有數據。
  6. 如果我關閉TELNET(客戶端進程)並運行“ netstat”,則會看到服務器套接字處於“ CLOSE_WAIT”狀態,因此我需要在服務器端關閉套接字。

問題是:如何查詢TCP套接字狀態以確定需要關閉此會話? (不使用send()/ recv(),就像“ netstat”一樣)

注意:我嘗試了“ getsockopt(socket,SOL_SOCKET,SO_ERROR,&optval和&optlen)”,但是當狀態為ESTABLISHED / CLOSE_WAIT且“ optval”也未更改時,它返回0。

阻塞模式套接字的常用技術是專用於讀取套接字的線程。 recv()返回0時,表示對等方已關閉連接,並且端口現在處於CLOSE_WAIT狀態。

或者,您可以使用select()和朋友告訴您套接字何時可讀,包括recv()返回零的情況。 使用FIONREAD作為輪詢機制實際上是沒有用的,因為它沒有涵蓋這種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM