3

我正在开发一个通过套接字接收 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); 
  }
}

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

有没有办法可以使用 Stream 套接字来做到这一点?如果唯一的方法是使用原始套接字,你能提供一个例子吗?

4

3 回答 3

1

如果我对您的理解正确,您希望 Receive 不被阻止吗?

看一下socket类的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
        // ...
    }
}
于 2012-01-15T19:55:39.080 回答
1

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

// will spin here until poll returns true
while(!socket.Poll(0, SelectMode.SelectRead));
socket.Receive...
于 2012-01-15T20:34:00.433 回答
0

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

于 2012-01-17T15:14:11.360 回答