2014-05-20 1 views
1

저는 소켓 프로그래밍 (특히 비동기 소켓)에 익숙하지 않습니다. C# AsyncSockets, 전에 데이터를받지 않고 데이터를 보낼 위치?

가 나는 AsynSocketserver (내 클라이언트가 동기 소켓을 사용)

은 기본적으로 작동 얻기 위해이 튜토리얼 http://www.codeproject.com/Articles/22918/How-To-Use-the-SocketAsyncEventArgs-Class을 사용했다. 클라이언트는 서버에 연결하여 데이터를 보내고 다시 에코를 가져올 수 있습니다. 나는 클라이언트가 어쩌면 (서버에 연결 서버에 일부 데이터를 보낼 수 싶어 이제

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); 
     } 
    } 

:하지만,

I의 (a SocketListener 클래스)이 코드 (에코없이) 데이터를 수신 할 수있다 클라이언트가 처음에 서버에 일부 데이터를 보내고 서버에 연결하기 만하면되며 클라이언트가 서버에서 일부 데이터를받을 수 있어야합니다.

문제점 : 이전에 데이터를받지 않고 socketEventArgs.senAsync() - 메서드를 사용하는 방법이나 위치를 알 수 없습니다.

현재 내가 송신() 사용하고 - 방법 토큰 클래스에 새로운 AsyncEventArgs 객체를 생성하고 데이터를 전송하기 위해 저장 (토큰에) 연결을 사용하여 작동

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

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

    } 

을, 그러나 이것은 잘못된 접근법 인 것 같습니다.

그렇다면 먼저 클라이언트로부터 데이터를받지 않고 열린 연결로 클라이언트에 데이터를 보내려면 어떻게해야합니까?

답변

0

나에게 유일한 것은 잘못된 값인 SendAsync (특히 실패의 경우 동 기적으로 반환되었을 수 있음)을 확인하지 않는다는 것과 "Completed"이없는 것입니다. 이벤트 구독이므로 동기식 또는 비동기식에서는 오류를 감지 할 수 없습니다. 또한 모든 send에 대해 하나씩 새로 작성하는 대신 SocketAsyncEventArgs 인스턴스를 재사용하는 것이 가능할 수도 있습니다.

근본적으로 : 괜찮습니다. 정말로 언제든지 보낼 수 있습니다.

+0

SocketAsyncEventArgs 인스턴스를 다시 사용하여 데이터를 수신하는 데 사용 된 인스턴스를 다시 사용하거나 모든 보낼 때마다 다시 사용되는 내 toke-class에서 글로벌 인스턴스를 만드시겠습니까? 데이터가 수신 된 인스턴스를 다시 사용함으로써 인스턴스가 데이터를 다시 수신하거나 데이터를 수신하도록 설정되어 있기 때문에 "System.InvalidOperationException"이 발생합니다. – Rul3r

+0

@ Rul3r 전송 대 수신에 대한 별도의 인수 –

관련 문제