2012-01-15 50 views
3

我正在研究一個低延遲金融應用程序,它通過套接字接收tcp數據。
這就是我正在做的套接字連接接收字節:防止線程從調用Socket.Receive時睡覺

public class IncomingData 
{ 
    Socket _Socket; 
    byte[] buffer = new byte[4096]; 

    public static void Connect(IPEndPoint endPoint) 
    { 
    _Socket = new Socket(
        AddressFamily.InterNetwork, 
        SocketType.Stream, 
        ProtocolType.Tcp); 

    _Socket.Connect(endPoint); 
    } 

    public static void ReadSocket(int ReadQty) 
    { 
    _Socket.Receive(buffer, 0, ReadQty, SocketFlags.None); 
    } 
} 

我聽說,當你調用Receive()上一個流套接字,調用線程處於睡眠狀態時,它被喚醒時,數據被接收。我希望線程能夠全速運行(使用CPU容量)。

有沒有一種方法可以使用Stream套接字來完成此操作?如果唯一的方法是使用原始套接字,您能提供一個例子嗎?

+1

當數據不存在時,將線程置於睡眠模式實際上是資源管理方面的一件好事。我完全沒有充分利用CPU的容量。如果數據尚未存在,您希望CPU運行的是什麼?只是一個空循環不斷輪詢數據? – 2012-01-15 20:00:04

+0

是的,我想做一個while循環繼續輪詢數據。基本上這樣一個線程不需要任何時間來喚醒。 – FuzzyLogic 2012-01-15 20:15:24

+1

這就完成了*完全相反的*,線程會燒掉它的量子,而不是預定一段時間。它顯着增加了延遲。 – 2012-01-15 20:39:54

回答

1

如果我理解你正確,你想接收不阻止?

查看套接字類的BeginX/EndX方法。這些方法異步執行(不阻塞當前線程)。他們接受回調方法作爲其參數之一,並且該操作完成時會調用該方法(在這種情況下,將接收數據)。它與事件基本相同。

public class IncomingData 
{ 
    Socket _Socket; 
    byte[] buffer = new byte[4096]; 

    public static void Connect(IPEndPoint endPoint) 
    { 
     _Socket = new Socket(
         AddressFamily.InterNetwork, 
         SocketType.Stream, 
         ProtocolType.Tcp);   

     _Socket.Connect(endPoint); 

    } 

    public static void ReadSocket(int ReadQty) 
    { 
     // Wait for some data to be received. When data is received, 
     // ReceiveCallback will be called. 
     _Socket.BeginReceive(buffer, 0, ReadQty, SocketFlags.None, ReceiveCallback, null); 
    } 

    private static void ReceiveCallback(IAsyncResult asyncResult) 
    { 
     int bytesTransferred = _Socket.EndReceive(asyncResult); 

     // ... 
     // process the data 
     // ... 
    } 
} 
+0

使用BeginReceive(),對ReceiveCallBack()的調用是通過線程池正確的嗎?我需要控制正在運行的線程的數量,並且線程池的延遲對於此應用程序來說太不可靠。 – FuzzyLogic 2012-01-15 20:19:34

1

您可以使用Socket.Poll來確定插座有數據,並保持否則紡:

// will spin here until poll returns true 
while(!socket.Poll(0, SelectMode.SelectRead)); 
socket.Receive... 
+0

我認爲這完美地解決了我的問題。 – FuzzyLogic 2012-01-15 21:20:35

+0

@FuzzyLogic:好的,測試它並讓我們知道。 – Tudor 2012-01-15 21:37:05

0

或許側步通過檢查networkComms.net,尤其是通過網絡發送數據的整個問題展示最基本功能的簡短示例here,希望不會過於複雜!您可能遇到的大多數問題都已經解決,它可能會爲您節省一些時間。