2009-11-21 5 views
0

서핑하는 동안 이미지를 캐시하는 데 사용되는 로컬 컴퓨터에서 실행되는 프록시 서버가 있습니다. 127.0.0.1의 프록시를 사용하여 브라우저를 설정하고 HTTP 요청을 수신하고 데이터를 가져 와서 브라우저로 다시 보냅니다. 그것은 큰 이미지를 제외하고 모두 잘 작동합니다.winsocket을 통해 이미지 받기

char buffer[1024] = ""; 
    string ret(""); 
    while(true) 
    { 
     valeurRetour = recv(socketClient_, buffer, sizeof(buffer), 0); 
     if(valeurRetour <= 0) break; 
     string t; 
     t.assign(buffer,valeurRetour); 
     ret += t; 
     longueur += valeurRetour; 
    } 
    closesocket(socketClient_); 
    valeurRetour = send(socketServeur_, ret.c_str(),longueur, 0); 

socketClient_ 비 차단 : 나 이미지 정보를받을 때, 절반 이미지 (예 : 구글 로고의 위쪽 절반)을 heres 내 코드를 표시합니다. 어떤 생각이이 문제를 해결하는 방법?

답변

2

recv의 가능한 반환 값을 구분하지 않아도됩니다.

두 가지 수준이 있습니다.

첫 번째는 0과 -1을 함께 묶는 것입니다. 0은 원격 피어가 연결의 절반을 보내지 않음을 의미하므로 코드가 제대로 작동하므로 소켓도 닫힙니다. -1은 데이터가 수신되는 것 외에 일어난 일을 의미합니다. 그것은 영구 오류, 일시적인 오류 또는 데이터 수신 이외에 어떤 일이 일어난 스택으로부터의 통지 일 수 있습니다. 코드는 이러한 모든 가능성을 함께 모으고 그 위에 원격 피어가 연결을 닫을 때와 동일하게 처리합니다.

두 번째 수준은 recv에서 -1을 얻는 모든 이유가 소켓이 더 이상 유용하지 않다는 점에서 "오류"라는 것이 아닙니다. -1을 검사하기 시작한 다음 WSAGetLastError을 호출하여 왜 -1인지 알아 내면 WSAEWOULDBLOCK이 나오는데, 이는 논 블로킹 소켓을 가지고 있기 때문에 정상입니다. 즉, recv 호출은 데이터를 반환 할 수 없습니다. 프로그램의 실행 스레드를 차단해야하고 Winsock에게 차단되지 않는 호출을 원한다고 말했기 때문입니다.

순진한 수정은 WSAEWOULDBLOCK에서 루프를 벗어나지 않는 것입니다.하지만 이것은 단지 데이터가 반환 될 때까지 recv을 호출하는 CPU 시간을 굽는다는 것을 의미합니다. 이것은 non-blocking 소켓의 전체적인 점에 반대한다. 네트워크가 바쁠 때 프로그램이 다른 일을하도록한다. select, WSAAsyncSelect 또는 WSAEventSelect과 같은 함수를 사용하여 API 함수 호출이 다시 성공할 가능성이 높을 때 알림을 받아야합니다. 그때까지는 전화하지 않습니다.

The Winsock Programmer's FAQ을 방문 할 수도 있습니다. (면책 조항 : 나는 그 유지 자다.)

0

HTTP 수준에서 거래를 분석 했습니까? 즉 헤더를 선택 했습니까?

Chunked 양도 등을 고려하고 계십니까?

여기에 제공된 세부 정보가 부족하기 때문에 부분적으로 답이 없습니다.

관련 문제