TCP-клиент Асинхронный обратный вызов сокета - PullRequest
0 голосов
/ 26 марта 2009

Обратите внимание, что вопрос касается использования режима асинхронного обратного вызова только на сокетах !

Я хочу создать TCP-клиент, который будет уведомлять меня, когда пакет получен и когда я закрываю сокет, потому что функции, которые NET предлагает с beginRecv, endRecv не сообщает, если соединение все еще доступно.

Мой вопрос: Разве нет способа создать TCP-клиент, похожий на WinAPI?

Я имею в виду вызов WSAAsyncSelect с сообщением, когда сообщение получено, оно вызывает функцию, которую вы вызвали в WSAAsyncSelect, и затем вы можете увидеть, закрыто ли соединение или есть новый пакет через WParams FD_CLOSE FD_READ FD_WRITE.

Если нет. Не могу ли я одновременно контролировать свое соединение и входящие пакеты? Я не хочу звонить в BeginRecv EndRecv все время. -.-

Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 27 марта 2009

Если вы передадите объект состояния, который включает ссылку на ваш сокет, у вас будет доступ к самому сокету.

public class SocketState
{
  public SocketState(Socket s)
  {
    this._socket = s;
  }

   private Socket _socket;
   public Socket Socket
   {
     get{return _socket;}
   }
}


void SomeFunction()
{
//do some stuff in your code

SocketState stateObject = new SocketState(mySocket);
mySocket.BeginReceive(buffer, offset, size, flags, CallBack, stateObject);
//do some other stuff
}

public void CallBack(IAsyncResult result)
{
  SocketState state = (SocketState)result.AsyncState;
  state.Socket.EndReceive(result);

  //do stuff with your socket.
  if(state.Socket.Available)
    mySocket.BeginReceive(buffer, offset, size, flags, CallBack, state);
}
1 голос
/ 26 марта 2009

Ваш вопрос не совсем понятен. Тоном вашего вопроса кажется, что вы не хотите делать никакой дополнительной работы. Вы не можете выполнять асинхронную работу без дополнительной работы.

Наилучшим подходом является использование асинхронного API от Microsoft с использованием BeginReceive / EndReceive. Они будут вызывать ваши обратные вызовы, когда сокет закрыт. Тем не менее, вы не можете легко использовать поддержку IO Stream в .NET, делая это, поэтому требуется дополнительная работа.

Если вы хотите больше контроля, вам нужно больше работать. Вот и все.

0 голосов
/ 26 марта 2009

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

Код типа сервера

Код простого гнезда

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