2012-08-27 5 views
1

때때로 이상한 문제가 발생합니다. 동기 소켓을 연결하여 데이터를 정상적으로 전송합니다.소켓 동기 수신

do 
{ 
    try 
    { 
     // blocking 
     int bytesRead = sender.Receive(bytesReceived); 

     // process the received bytes 
    } 
    catch (SocketException soex) 
    { 
     throw new Exception(String.Format("Socket exception..." +Environment.NewLine+"[Code: {0}] {1}",soex.ErrorCode,soex.Message)); 
    } 
} 
while (sender.Poll(1500, SelectMode.SelectRead) && sender.Available > 0); 
내가 와이어에 와서 시간을 얻기 위해 패킷에 대한 응답을 기다리는 시간으로 설문 조사를 넣을 이유가 그래서 나는 영원히이 차단되기 때문에 수신에 체류하지 않을

그리고 Available과 함께 실제 데이터가 더 이상 없을 때 휴식을 취할 수 있습니다.

내가 얻는 문제는 client.Available> 0이 거짓 (바이트가 있음) 일 때 false를 반환한다는 것입니다. 잠시 후 Debug.WriteLine을 삽입하여 출력하는 방법 사용 가능한 많은 바이트를 사용할 수 있으며 숫자를 얻습니다.

아이디어가 있으십니까? 나는 당혹 스럽다.

+2

단순히 'ReceiveAsync'를 사용하지 않는 이유는 무엇입니까? –

+0

false를 반환하는 표현식은 무엇입니까? '보낸 사람 .Poll (1500, SelectMode.SelectRead)'또는'sender.Available> 0'? –

+0

아마 당신은 디버거에 있지만 표현식이 실행되었을 때 바이트가 있습니까? –

답변

0

sender.Poll은 false를 반환하지만 여전히 읽을 데이터를 반환합니다. 어쩌면 을 바꾸고- 조건을 sender.Available > 0으로 바꾸고 sender.Poll을 루프 내부에서 호출 할 수 있습니다.

편집 : 당신은 너무 오래 차단에서 읽기 호출을 방지하기 위해 소켓 제한 시간을 설정해야 할 수도 있습니다

int length; 
do { 
    length = socket.Read(buffer); 
    // process "buffer" 
} while (length > 0); 

: 은 어쩌면이 (의사 코드) 충분하다.