2016-01-07 2 views
2

Я написал http-клиент на C и создал почтовый метод для моего сервера, на котором запущен php-скрипт, который получит параметры клиента и вернет некоторый ответ клиенту. Однако после успешного подключения сокета сервер ничего не возвращает. Что мне не хватает в моем коде?HTTP POST не возвращает правильный ответ в c

Вот мой с клиентом на основе из офф Winsock2

/* 
    * Create a TCP socket 
    * @author Salim Said 
    * Jan 7 2016 
    */ 

    #include<stdio.h> 
    #include<winsock2.h> 

    #pragma comment(lib,"ws2_32.lib") //Winsock Library 

    int main(int argc , char *argv[]) 
    { 
     WSADATA wsa; 
     SOCKET s; 
     struct sockaddr_in server; 
     char *message , server_reply[2000]; 
     int recv_size; 

     printf("\nInitialising Winsock..."); 
     if (WSAStartup(MAKEWORD(2,2),&wsa) != 0) 
     { 
      printf("Failed. Error Code : %d",WSAGetLastError()); 
      return 1; 
     } 

     printf("Initialised.\n"); 

     //Create a socket 
     if((s = socket(AF_INET , SOCK_STREAM , 0)) == INVALID_SOCKET) 
     { 
      printf("Could not create socket : %d" , WSAGetLastError()); 
     } 

     printf("Socket created.\n"); 


    // server.sin_addr.s_addr = inet_addr("196.46.123.151"); 
     server.sin_addr.s_addr = inet_addr("66.96.147.96"); 
     server.sin_family = AF_INET; 
     server.sin_port = htons(80); 

     //Connect to remote server 
     if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0) 
     { 
      puts("connect error"); 
      return 1; 
     } 

     puts("Connected"); 


     //----------------------------------------------------------HTTP HEADER PLUS MESSAGE--------------------------------------// 
     message = "POST /echo.php HTTP/1.0\r\n Host: www.vocha.co.tz\r\n Content-type: application/x-www-form-urlencoded\r\n Content-Length: 16\r\n\r\n name=iAmWorking!"; 

     if(send(s , message , strlen(message) , 0) < 0) 
     { 
      puts("Send failed"); 
      return 1; 
     } 
     puts("Data Send\n"); 

     //Receive a reply from the server 
     if((recv_size = recv(s , server_reply , 2000 , 0)) == SOCKET_ERROR) 
     { 
      puts("recv failed"); 
     } 

     puts("Reply received\n"); 

     //Add a NULL terminating character to make it a proper string before printing 
     server_reply[recv_size] = '\0'; 
     //print the Server reply 
     puts(server_reply); 
     //show receive success message 
     puts("Data received successfully!"); 
     //We are done receiving data! close the socket 
     closesocket(s); 
     WSACleanup(); 
     return 0; 
    } 

А вот мой стороне сервера PHP скрипт

<?php 

    // get name from post parameter and store it in variable $name 
    $name=$_POST['name']; 

    //echo back a greeting with the user's name 
    //this is what will appear in client's HTTP response 
    echo 'Hi ' . $name; 

    ?> 

Вот часть ответа сервера и мои сообщения для отладки.

Initialising Winsock... 
    Initialised. 
    Socket created. 
    Connected 
    Data Send 
    Reply received 
    <*****Missing response is supposed to appear here*****> 
    Data received successfully! 
+1

Предлагаю распечатать значение 'recv_size'. Кроме того, попробуйте выполнить код в отладчике, по очереди и проверить значения всех переменных при шаге. –

+0

@JoachimPileborg Спасибо за ваше предложение, позвольте мне посмотреть, поможет ли это. – electronicsalim

ответ

1

Ваше сообщение имеет неправильный формат синтаксиса HTTP и отклоняется сервером без ответа.

Если вы принимаете это:

message = "POST /echo.php HTTP/1.0\r\n Host: www.vocha.co.tz\r\n Content-type: application/x-www-form-urlencoded\r\n Content-Length: 16\r\n\r\n name=iAmWorking!"; 

Это означает:

POST /echo.php HTTP/1.0[CR][LF] 
[SP]Host: www.vocha.co.tz[CR][LF] 
[SP]Content-type: application/x-www-form-urlencoded[CR][LF] 
[SP]Content-Length: 16[CR][LF] 
[CR][LF] 
name=iAmWorking! 

См? вы добавили пробел перед токеном заголовка («\ r \ n» вместо «\ r \ n»), это недопустимый синтаксис, и сервер предпочитает тихо закрывать соединение tcp/ip вместо того, чтобы откликаться на время скрипт злоумышленника (поскольку этот coudl используется сценариями HTTP smuggling).

+0

Ohohohohoho !, устраняя проблемы, проблема [HTTP-контрабанда] (https://tools.ietf.org/html/rfc7230#section-9.5) тоже была очень полезна. Большое спасибо. – electronicsalim

Смежные вопросы