2009-08-30 2 views
1

소켓 수준에서 비동기 메서드를 사용할 때 처음에는 관련 네트워크 스트림에서 데이터를 보내고받는 데 문제가 없어야하며 소켓에서 '직접'문제가 없어야합니다. 그러나 이미 알고있을 것입니다.C# TCP 소켓, 비동기 읽기 및 쓰기 "같은"시간 (.NET CF), 어떻게?

문제는 특히 Windows Mobile 플랫폼과 Compact Framework에서 강조 표시됩니다.

비동기 방식를 사용하여 수행하고 BeginReceive 콜백 함수는 비동기로부터 수신 된 데이터 (EndReceive)에 대해 대기중인 비동기 읽기를 종료한다. 결과.

소켓에서 지속적으로 데이터를 수신해야하므로 데이터를 기다리는 루프가 있습니다. 데이터를 보내려 할 때 문제가 시작됩니다. 소켓을 통해 일부 데이터를 보내기 전에 그 목적을 위해 나는 EndReceive로 비동기식 읽기의 끝을 "강제로"합니다. 위의 지연이입니다 (가끔은 기다릴 수 없습니다. 타임 아웃). 시간 초과가 너무 길며 즉시 데이터를 보내야합니다.. 어떻게? 소켓을 닫고 다시 연결하고 싶지 않습니다.

데이터를 보내기 위해 동기 메서드를 사용합니다 (결과는 비동기와 같습니다. BeginSend/EndSend 메서드와 동일 함). 전송이 끝나면 다시 데이터를 수신하기 시작합니다. 내가 알고

자료 :

P.S.:I 비동기 수신 종료하지 않고 데이터를 보내려고하지만 난 SocketException이있어 : (: 10036 ErrorCode가)이 블럭킹 작업이 현재 실행됩니다.

미리 감사드립니다. 나는이 '하나의 작은 문제'혼자가 아니에요 희망 ... :)

답변

1

당신이 있는지 확인하기 위해) 대신 BeginReceive의 정적 방법을 설문 조사를 사용 (또는 여러 개의 소켓을위한 선택으로 간주 되세요 읽기위한 데이터? 내 의견으로는 이것은 당신에게 문제를 일으키는 것입니다.

+0

예, 참으로 Poll 메서드를 사용하면 항상 블로킹, 오류, 예외 (지금까지)없이 소켓을 통해 읽고 쓸 수 있습니다. 대단히 감사합니다! 나는이 답을 찾기 위해 2 일을 낭비했다. :) 참조 : http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.poll.aspx – Beaver

+0

@Beaver는 코드에서 설문 조사를 사용한 위치를 설명 할 수 있습니까? (또는 코드를 넣으라고 제안하는 Yakeen) 비동기 소켓을 사용할 때? –