2010-02-18 3 views
4

질문이 있습니다. 소켓을 만들고 연결하고 바이트를 보내면 모두 정상입니다.C++ 소켓 창

그리고 데이터 수신을 위해 recv 기능을 사용합니다.

char * TOReceive= new char[200]; 

recv(ConnectSocket, TOReceive , 200, 0); 

일부가 읽고 데이터와 retuns, succefull가

및 데이터가 데이터를 기다리는하지 않는 경우, 모든 I 10 초 데이터가 반환해야하는 경우, 예를 들어, 시간 대기 제한 할 필요가있다.

많은 감사.

답변

6

Windows 소켓에는 select 기능이 있습니다. 소켓 핸들과 소켓을 전달하여 가독성과 타임 아웃을 확인하고, 소켓이 읽기 가능하게되었는지 또는 타임 아웃에 도달했는지 여부를 알려줍니다.

참조 : http://msdn.microsoft.com/en-us/library/ms740141(VS.85).aspx

은 그 방법은 다음과 같습니다가 true를 돌려주는 경우

bool readyToReceive(int sock, int interval = 1) 
{ 
    fd_set fds; 
    FD_ZERO(&fds); 
    FD_SET(sock, &fds); 

    timeval tv; 
    tv.tv_sec = interval; 
    tv.tv_usec = 0; 

    return (select(sock + 1, &fds, 0, 0, &tv) == 1); 
} 

, recv에 다음 호출이 일부 데이터 즉시 반환해야합니다.

select에서 오류 반환 값을 확인하고 예외를 던져서 더 강력하게 만들 수 있습니다. 여기에 하나의 핸들을 읽을 준비가되었다고 말하면 그냥 true을 반환하지만, 소켓이 이미 닫혀있는 것을 포함하여 다른 모든 상황에서는 false가 반환된다는 의미입니다.

+0

감사합니다. 작은 예를 하나만 들려주세요. select (...); 그 후 recv ?? –

+0

오, 그럼 어서. –

+0

아마 미쳤 겠지만'select '보다'WSAEventSelect'와'WaitForSingleObject'를 선호합니다. 유닉스에서'poll'을 선호하는 것처럼. '선택'은 단지 오래되고 기묘한 찾고 있습니다. 누군가 내가 그것을 옹호하는 것을들을 때마다 저의 일부가 죽습니다. – asveikau

0

recv에 전화하기 전에 select 함수를 호출해야 읽을 것이 있는지 여부를 알아야합니다.

0

SO_RCVTIMEO 소켓 옵션을 사용하여 recv() 호출에 대한 시간 초과 값을 지정할 수 있습니다.