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

标签 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 套接字来做到这一点?如果唯一的方法是使用原始套接字,您能否提供一个示例?

最佳答案

如果我没理解错的话,你希望 Receive 不阻塞?

看看套接字类的 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
        // ...
    }
}

关于c# - 调用 Socket.Receive 时防止线程休眠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8872771/

相关文章:

sockets - TCP/UDP 多路分解是如何工作的?

java - SSH 连接 Java

c# - 从数据库创建按钮 - 发生 System.NullReferenceException

java - 如何用Java代码重写或转换C#代码?

c# - 确定应用程序的关闭方式

swift - 如何让IBM BlueSocket运行在GUI应用程序上并支持多连接

c# - TCP 实时多人游戏

c# - 如何在 C# 中更新 WebBrowser 控件内的 DOM 内容?

java - 由 : libcore. io.ErrnoException 引起:套接字失败:EACCES(权限被拒绝)

c - Unix 套接字的 sockaddr_un.sun_path 区分大小写吗?