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ソケットを使用してこれを行う方法はありますか?唯一の方法がRawソケットを使用する場合、例を挙げていただけますか?

4

3 に答える 3

1

Socket.Pollソケットにデータがあるかどうかを判断し、それ以外の場合は回転を続けるために使用できます。

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

私の理解が正しければ、レシーブにブロックしないでもらいたいですか?

BeginXソケット クラスの/EndXメソッドを見てください。これらのメソッドは非同期で実行されます (現在のスレッドでブロックされません)。パラメータの 1 つとしてコールバック メソッドを受け入れ、操作が完了するとそのメソッドが呼び出されます (この場合、データが受信されます)。基本的にはイベントと同じです。

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 に答える
0

おそらく、 networkComms.netをチェックして、ネットワークを介してデータを送信するという問題全体を回避します。特に、ここで最も基本的な機能を示す短い例を示します。複雑すぎないことを願っています。発生する可能性のある問題のほとんどはすでに解決されており、時間を節約できる可能性があります。

于 2012-01-17T15:14:11.360 に答える