[英]How to handle empty socket buffer
我正在寫一個套接字服務器,我注意到如果它收到一個空的套接字緩沖區,它將導致一個socketexception。 在接收調用中,如何在套接字關閉之前檢測和處理空緩沖區,並向客戶端發送-1響應?
碼:
try
{
byte[] byteBuffer = new Byte[1024];
int size = m_clientSocket.Receive(byteBuffer);
if (size > 0)
{
ParseReceiveBuffer(byteBuffer, size);
}
else
{
m_clientSocket.Send(BitConverter.GetBytes(-1));
}
}
catch (SocketException ex)
{
if (ex.SocketErrorCode == SocketError.WouldBlock ||
ex.SocketErrorCode == SocketError.IOPending ||
ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
{
// socket buffer is probably empty, wait and try again
Thread.Sleep(1000);
}
// connection was unexpectively closed
}
假設您正在使用TCP層。
諸如發送和接收之類的套接字功能實際上並未通過網絡發送或接收數據。 它們與OS套接字層進行通信,以從網絡層推送或彈出數據。 因此,當您從應用程序方法“發送”運行時,它將放入隊列數據以發送到OS網絡層。 只有在該OS之后,它才真正發送它並可能會出現一些問題,這樣,它將存儲錯誤並直接將其直接從應用程序中調用該特定套接字方法。
這就是為什么僅在上一個可能失敗或在先前和當前調用網絡之間出現某些錯誤(例如連接丟失)時才在下一次調用時收到SocketException的原因。
當將要接收異常時,您將始終不接收任何內容(零字節)。 由於連接丟失(在大多數情況下(99%)),您無法在異常后發送任何內容。
客戶端也會收到異常,該異常還會顯示有關連接丟失的錯誤消息。
適當使用DataAvailable子句。 我建議您編寫完整的類和幫助器方法來執行所有這些常規操作。 不需要thread.sleep(1000),因為偵聽器將等待命令行執行。 另一種方法是使用開發的套接字庫,您可以輕松地模擬服務器和客戶端角色。我知道超級套接字,可以自定義和開發自己的協議。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.