2015-01-12 9 views
0

데이터를 성공적으로 보낸 후 recv 클라이언트의 첫 번째 응답 있지만 두 번째 그의 세부 사항을 넣은 후 제출하지 않는 문제를 다루고 있습니다. 왜 이런 일이 일어 났는지 생각해보십시오.Tcp 소켓 recv 함수가 작동하지 않습니다. C++

sock->listenAndAccept(); 
    string url="HTTP/1.1 302 Found \r\nContent-Type: text/html; charset=utf8 \r\nContent-  Length:279\r\n\r\n<!DOCTYPE html><html><head><title>Creating an HTML Element</title></head><body><form name=\"input\" action=\"login.html\" method=\"get\">user name: <input type=\"text\" name=\"user\"><br>password: <input type=\"text\" name=\"password\"><input type=\"submit\" value=\"Submit\"></form></body></html>"; 
    sock->send(url.data(),url.length()); 
    char buffer[1000]; 
    sock->recv(buffer, 1000); 
    cout<<buffer<<endl; 
    sock->recv(buffer, 1000); 
    cout<<buffer<<endl; 

듣고 기능 동의 :

TCPSocket* TCPSocket::listenAndAccept(){ 
    int rc = listen(socket_fd, 1); 
    if (rc<0){ 
     return NULL; 
    } 
    size_t len = sizeof(peerAddr); 
    bzero((char *) &peerAddr, sizeof(peerAddr)); 

    int connect_sock = accept(socket_fd, (struct sockaddr *)&peerAddr,(unsigned int *)&len); 
    return new TCPSocket(connect_sock,serverAddr,peerAddr); 
} 

RECV 기능 :

int TCPSocket::recv(char* buffer, int length){ 
    return read(socket_fd,buffer,length); 
} 
+0

'Content-'와'Length :'사이의 공백은 무엇입니까? – immibis

+0

또한 클라이언트를 작성 했습니까? 클라이언트가 응답을 보내는 것을 어떻게 알 수 있습니까? (나는 당신의 클라이언트가 웹 브라우저라고 의심하고 새로운 연결을 열어 본다.) [ – immibis

+0

] 웹 브라우저를 클라이언트로 사용하고있다. – user3100708

답변

0

항상 항상 (나는 종종 그렇게 말할 수 없다) recv의 반환 값을 확인하십시오. recv까지 최대 금액은입니다. 요청한 금액이 확실하다면 수신 할 것으로 예상되는 것을받을 때까지 들어오는 데이터를 버퍼링하는 recv 주위의 루프로 들어가야합니다.

이러한 종류의 버그는 매우 빠른 localhost 인터페이스를 사용하여 로컬 컴퓨터에서 테스트하고 다른 호스트에서 클라이언트와 서버를 실행하자 마자 표면을 보지 못하고 숨어있는 경향이 있습니다.

테스트 코드에서 실제 코드로 이동하면 길이가 0 인 응답 (클라이언트가 소켓을 닫음)과 오류 코드 (< 응답이 0)도 처리해야합니다.

마지막으로 고객 코드를 게시하십시오. 거기에 버그가있을 수 있습니다.

+0

클라이언트 코드가 없습니다. 제 의뢰인은 웹 브라우저입니다. 처음으로 recv의 반환 값은 사이트가 작동 중임을 받아들이는 것이며 recv 함수에 막 붙어서 응답을 기다리지 않고 대기합니다. – user3100708

+0

브라우저에서 페이지를 읽었으며 페이지에 자격 증명을 입력 할 수 있지만 양식 제출을 볼 수 없습니까? 그렇다면 현대 브라우저는 웹 사이트에 대한 여러 개의 동시 연결을 열어 성능을 향상시킬 수 있다고 생각하는 것을 기억하십시오. 브라우저가 연결 대기 중이고 수신 대기 백 로그에 걸려 있기 때문에 '사이트'에서 포기했을 수 있습니다. –

1

TCP는 스트림 중심의 프로토콜을 다음은 내 코드입니다. 첫 번째 recv에서 모든 메시지를 읽은 것일 수 있습니다. 수신 된 데이터의 크기를 확인하고 예상 된 출력과 일치하는지 확인하십시오.

+0

불가능합니다. 나는 한 단계 씩 프로그램을 디버깅하고 첫 번째 recv 완료 직후에 사이트에 사용자 이름과 암호의 세부 정보를 넣었습니다. 그리고 두 번째 recv는 아무 것도 얻지 않고 단지 – user3100708

+0

을 로딩하고 로딩하는 사이트는 아무 것도 얻지 못하고 = 데이터를 기다리고 아무것도 얻지 못했습니다. 그는 여전히 그것을 기다리고있다. – user3100708

+0

그것은 단순히 읽을 것이 없다는 것을 의미한다. – doptimusprime

관련 문제