2013-07-09 6 views
0

문제 : 우리는 성공적으로 메시지를 게시 할 서버 있지만없는 와 통신 할 수 있습니다소켓 프로그램 - C (리눅스)

. 서버가 "Your browser sent a request that this server could not understand"으로 응답했기 때문입니다. 이것은 아래 문자열의 형식이 잘못되었을 때 발생했습니다.

샘플 코드 :

"POST /evs/getServerAddress?uid=abcd&pwd=abcd HTTP/1.1\r\n"; 
"Host: https://evs.idrive.com\r\n"; 
"Connection: Close\r\n\r\n"; 

//#include<sys/socket.h> 
//sockfd is socket 
//above three strings are passed as option_value1, option_value2 and option value3 
send(sockfd, option_value1, sizeof(option_value1), 1); 
send(sockfd, option_value2, sizeof(option_value2), 1); 
send(sockfd, option_value3, sizeof(option_value3), 1); 

문제 : 이제 서버가 아무것도에 응답하지 않습니다. 친절하게도 서버에서 응답을 얻기위한 여러 가지 방법을 알려주십시오. 라인

send(sockfd, option_value1, sizeof(option_value1), 1); 

sizeof(option_value1)에서 미리

+0

확인 서버 로그를 - 서비스가 계속 실행 : 적절한 POST 요청은 같을 것이다? – suspectus

+1

'sizeof()'대신에'strlen()'을 사용하고'Host' 헤더를 수정하면 값이 잘못되었습니다. –

답변

2

코드에 몇 가지 문제가 있습니다.

  1. 레미 LeBeau가 언급 한 바와 같이

    , 당신은 Host 헤더 보내는 값이 잘못되었습니다. 접두사는 https://이어야합니다.

  2. 또한 언급 한대로 strlen()이 아닌 길이가 sizeof()이 아닌 문자열을 보내야합니다. 문자 배열 (포인터가 아님)의 크기를 사용하더라도 바이트가 너무 길어질 수 있습니다.

  3. send()의 마지막 인수는 이 아니라 0이어야합니다. 1 (MSG_OOB)으로 설정하면 데이터가 대역 외 데이터로 전송되기 때문에 원하는 데이터가 거의 없습니다.

  4. send()의 반환 값을 확인하지 않습니다. 당신은 정말로 - send()이 요청 된 모든 바이트를 전송하지 않을 수 있습니다.

  5. 가장 중요한 것은 : POST 요청이 잘못되었습니다. 본문이없고 Content-Length/Content-Type이 없습니다.POST 변수가 URL에 전달되는 것처럼 보이지만 POST가 아닌 GET 요청을 통해 수행됩니다.

    POST /evs/getServerAddress HTTP/1.1 
    Host: evs.idrive.com 
    Content-Type: multipart/x-www-form-urlencoded 
    Content-Length: 17 
    
    uid=abcd&pwd=abcd 
    
0

에서

덕분에 포인터의 크기로 평가합니다. 시스템에 따라 4 바이트가 될 수도 있고 그렇지 않을 수도 있습니다. 따라서 여러분은 단지 4를 보내거나 시스템의 포인터 크기가 무엇이든 문자열의 바이트를 보냅니다.

문자열 길이를 얻으려면 strlen(option_value1)을 사용하십시오.

WireShark 프로그램 호출을 사용하여 전송중인 것을 확인할 수 있습니다. 무료이며 네트워크 연결에서 진행중인 작업을 표시 할 수 있습니다. 전송중인 항목과 수신중인 항목. WireShark는 전송중인 HTTP 패킷의 형식이 잘못된 경우에도 알려줍니다.

서버가 프로그램에 응답하지 않으면 ping 요청에 응답하고 있습니까? 이것은 유용한 도구입니다. ping에 응답하는 경우 서버가 정상적으로 작동하는지 확인하고, 그렇지 않으면 서버를 다시 시작해야합니다.