나는 WM6 C#에서 비 블로킹 소켓을 만들기 위해 노력하고 있지만 나는 다음과 같은 컴파일러 오류가 계속 :C# 컴팩트 프레임 워크 비 블로킹 소켓을 만드는 방법
이"동기 호출 비 블로킹 소켓에 지원되지 않습니다 Blocking = true로 설정하거나 비동기 메서드를 사용하십시오. "
그러나 BeginReceive() 비동기 메서드를 사용하면 EndReceive()가 차단됩니다. BeginSend() 및 EndSend()와 동일합니다. 소형 프레임 워크 내에서 비 차단 소켓은 어떻게합니까?
여기 내 코드가 있습니다. bytesRecv 및 bytesSent 변수를 반환하기 때문에 AsyncCallback 메서드를 사용하지 않습니다.
private void asyncReceive(byte[] recvBytes, int offset, int size, SocketFlags sf)
{
IAsyncResult asyncResult = null;
int recvBytes = 0;
try
{
asyncResult = _socket.BeginSend(sendBytes, offset, size, sf, null, null);
recvBytes = _socket.EndSend(asyncResult); // <-- This blocks even with _socket.Blocking = false;
}
catch (SocketException)
{
//Check SocketException.ErrorCode...
}
return recvBytes;
}
[여기] (http://msdn.microsoft.com/en-us/vstudio/gg316360)에서 이와 같은 코드를 작성하고 원하는 동작을 얻을 수있는 새로운 기능이 있지만 의심 스럽습니다. CF가 꽤 많이 보였기 때문에 .NET Compact Framework에 백 포트 될 것입니다. – nitzmahone
Matt 's correct : 콜백으로 Begin/End를 사용하기 만하면됩니다. 소켓을 다룰 때, "blocking/nonblocking"은 "synchronous/asynchronous"와는 다른 의미가 있습니다. 관리 코드에서 * nonblocking * 소켓을 사용하려면 폴링 루프를 설정해야합니다. 소켓을 사용하는 가장 좋은 방법은 * 비동기 블로킹 * 모델 (작업 자체가 블로킹되어 있지만 코드 완성이 비동기 적으로 통보되어 코드가 실제로 차단되지 않음)입니다. –