Предотвратить спящий поток при вызове сокета. Получить - PullRequest
3 голосов
/ 15 января 2012

Я работаю над финансовым приложением с низкой задержкой, которое получает 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, чтобы вызывающий поток был переведен в спящий режим, и он проснулся при получении данных.Я хотел бы, чтобы поток работал на полной скорости (с использованием процессорной мощности).

Есть ли способ сделать это с помощью сокета Stream?Если единственный способ заключается в использовании Raw-сокета, не могли бы вы привести пример?

Ответы [ 3 ]

1 голос
/ 16 января 2012

Вы можете использовать Socket.Poll, чтобы определить, есть ли в сокете данные, и продолжать вращаться в противном случае:

// will spin here until poll returns true
while(!socket.Poll(0, SelectMode.SelectRead));
socket.Receive...
1 голос
/ 15 января 2012

Если я правильно вас понимаю, вы хотите, чтобы Получение не блокировалось?

Взгляните на 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 голосов
/ 17 января 2012

Возможно, обойдем всю проблему отправки данных по сети, проверив networkComms.net и, в частности, краткий пример, демонстрирующий основную функциональность здесь , надеюсь, не слишком сложную ! Большинство проблем, с которыми вы можете столкнуться, уже решены, и это может сэкономить вам время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...