2009-12-21 4 views
2

아래의 간단한 코드에서와 같이 SendAsync()가 버퍼에서 원하는 모든 바이트를 올바르게 전송했는지 확인하고 있습니까? 아니면 과다한가? 이것은 TCP 연결 소켓 용입니다. 나는 특히 ProcessSend() 내에서 SendAsync()에 대한 두 번째 하위 호출을 발행해야하는 것에 관심이있다.SendAsync가 보내기를 완료했는지 확인

예를 들어 각 메시지에 대해 새로운 (풀링 된) SocketAsyncEventArg를 사용하여 클라이언트에 데이터를 전송하는 스레드가 여러 개있는 경우 부분 전송 메시지 사이에 동시 전송이 끼어들 가능성이 있습니까? 또는 하나의 SocketAsyncEventArg 만 데이터 전송에 사용되도록 허용하여 클라이언트에 대한 액세스를 제어해야하는 이유입니까?

private void ProcessSend(SocketAsyncEventArgs e) 
{ 
    // Check that data was sent 
    if ((e.SocketError == SocketError.Success) && (e.BytesTransferred > 0)) 
    { 
     AsyncSendUserToken token = (AsyncSendUserToken)e.UserToken; 

     // Check that all the data was sent 
     int offset = e.Offset + e.BytesTransferred; 
     if (offset < e.Count) 
     { 
      // Call send again to finish the send 
      e.SetBuffer(offset, e.Count - offset); 
      bool _willRaiseEvent = token.Socket.SendAsync(e); 
      if (!_willRaiseEvent) 
       ProcessSend(e); 
     } 
    } 
} 
+0

내가이 일 본 (e.Count이 < e.BytesTransfered)와 나는 또한 본

경우 전송 된 바이트 수가 e.Count - e.Offset보다 큰 경우. 하나의 SocketAsyncEventArgs를 보내기 위해 재사용하고 버퍼를 채우고 ProcessAsend에서 SendAsync를 호출하는 메서드를 호출했습니다. ProcessSend에서 현재 SocketAsynEventArgs를 삭제하고 새 SocketAsynEventArgs를 삭제하는 코드를 추가 했으므로이 오류가 발생하지 않았습니다. –

답변

2

난 당신이 http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx에서 예를 읽고 생각하고 그들이 ProcessReceive의 바이트 길이를 확인하는 것을 알 수있다.

매번 상대방으로부터 전송되는 바이트 수를 제어 할 수 없으므로 수신 된 모든 바이트를 가져 오기 위해 수행됩니다.

전송을 수행 할 때 프레임 워크가 모든 데이터를 처리하기 때문에이 작업은 중복됩니다. 그것은 바이트 배열에의 오프셋 (offset) 아니에요,

// Check that all the data was sent 
int offset = e.Offset + e.BytesTransferred; 
if (offset < e.Count) 
{ 

e.Count 바이트의 수를 전송하는 것입니다 :

1

나는 코드에서 뭔가 문제가 있다고 생각.

그래서 사과와 사과를 비교하기 위해, 당신은 말할 것 : { }