调用Socket.Receive时防止线程休眠

时间:2012-01-15 19:46:12

标签: c# sockets networking raw-sockets low-latency

我正在开发一个低延迟的财务应用程序,它通过套接字接收tcp数据 这就是我如何建立套接字并接收字节:

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); 
  }
}

我听说当你在Stream套接字上调用Receive()时,调用线程进入休眠状态,并在收到数据时被唤醒。我希望线程以全速运行(使用CPU容量)。

有没有办法可以使用Stream套接字执行此操作?如果唯一的方法是使用Raw套接字,你能提供一个例子吗?

3 个答案:

答案 0 :(得分: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
        // ...
    }
}

答案 1 :(得分:1)

您可以使用Socket.Poll来确定套接字是否有数据,否则继续旋转:

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

答案 2 :(得分:0)

或许通过查看networkComms.net并特别是展示最基本功能here的简短示例,通过网络发送数据的整个问题,希望不要过于复杂!您可能遇到的大多数问题已经解决,可能会为您节省一些时间。