C # AsyncSockets, куда отправлять данные без получения данных раньше?

1

Я новичок в программировании сокетов (особенно в asyncsockets).

Я использовал этот учебник http://www.codeproject.com/Articles/22918/How-To-Use-the-SocketAsyncEventArgs-Class для получения AsynSocketserver (мой клиент использует синхронные сокеты)

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

У меня есть этот код (в классе SocketListener) для приема данных (без эха):

private void ProcessReceive(SocketAsyncEventArgs e) {
        //check if remote host closed the connection
      if (e.BytesTransferred > 0) {
            if (e.SocketError == SocketError.Success) {
                Token token = e.UserToken as Token;

                token.SetData(e);

                Socket s = token.Connection;

               if (s.Available == 0) {
                    token.ProcessData(e);


               }

                bool IOPending = s.ReceiveAsync(e);
                if (!IOPending) {
                    ProcessReceive(e);
                } 

            //echo back
          /*     if (s.Available == 0) {
                    //set return buffer
                    token.ProcessData(e);
                    if (!s.SendAsync(e)) {
                        this.ProcessSend(e);
                    }
                } else if (!s.ReceiveAsync(e)) {
                    this.ProcessReceive(e);
                }*/
            } else {
                this.ProcessError(e);

            }
        } else {

            this.CloseClientSocket(e);
        }

    }
private void ProcessSend(SocketAsyncEventArgs e) {
        if(e.SocketError == SocketError.Success){
            Token token = e.UserToken as Token;

            if(!token.Connection.ReceiveAsync(e)){
                this.ProcessReceive(e);
            }
        } else {
            this.ProcessError(e);
        }
    }

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

Проблема: я понятия не имею, где и как использовать socketEventArgs.senAsync() -method, не получая данные раньше.

В настоящее время я использую send() -method в Token-Class, который создает новый объект AsyncEventArgs и использует (в токене) сохраненное соединение для отправки данных:

      public void send() {
        SocketAsyncEventArgs args = new SocketAsyncEventArgs();

        args.UserToken = this;
        args.SetBuffer(sendBuffer, 0, sendBuffer.Length);
        connection.SendAsync(args);

    }

он работает, но это, кажется, неправильный подход.

Итак, как я могу отправить данные клиенту с открытым соединением, не получая сначала данные от клиента?

Теги:
sockets
asyncsocket
send

1 ответ

0
Лучший ответ

Для меня единственное, что "неправильно" в том, что вы не проверяете возвращаемое значение SendAsync (он мог бы вернуться синхронно, особенно в случае сбоя), - и у вас нет подписки на событие Completed, поэтому при синхронном или асинхронном вы не сможете обнаружить сбой. Кроме того, возможно, возможно (и, конечно же, желательно) повторно использовать экземпляр SocketAsyncEventArgs, а не новый для каждой отправки.

Но принципиально: отлично. На самом деле вы можете отправить сообщение в любой момент.

  • 0
    Под повторным использованием экземпляра SocketAsyncEventArgs вы имеете в виду повторное использование экземпляра, который использовался для получения данных, или создания глобального экземпляра в моем классе токенов, который повторно используется при каждой отправке? Потому что путем повторного использования экземпляра, в котором были получены данные, я получаю «System.InvalidOperationException», потому что экземпляр настроен на получение данных снова / прослушивание данных.
  • 0
    @ Rul3r отдельные аргументы для отправки против получения

Ещё вопросы

Сообщество Overcoder
Наверх
Меню