아래의 간단한 코드에서와 같이 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);
}
}
}
내가이 일 본 (e.Count이 < e.BytesTransfered)와 나는 또한 본
경우 전송 된 바이트 수가 e.Count - e.Offset보다 큰 경우. 하나의 SocketAsyncEventArgs를 보내기 위해 재사용하고 버퍼를 채우고 ProcessAsend에서 SendAsync를 호출하는 메서드를 호출했습니다. ProcessSend에서 현재 SocketAsynEventArgs를 삭제하고 새 SocketAsynEventArgs를 삭제하는 코드를 추가 했으므로이 오류가 발생하지 않았습니다. –