2016-11-18 11 views
0

Я хочу отправить данные сообщения в php-скрипт, но php никогда не получает данные моего сообщения. Вот мой код:Ошибка отправки данных сообщения в C с сокетом

#include<stdio.h> 
#include<winsock2.h> 
#include <string.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[1024] , 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("127.0.0.1"); 
    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"); 

    // Work well with Get Method 
    // strcat(message, "GET /voleur/receiver.php?arg1=Hello HTTP/1.1\n"); 
    strcpy(message, "POST /voleur/receiver.php HTTP/1.1\r\n"); 
    strcat(message, "Host: 127.0.0.1:80\r\n"); 
    strcat(message, "Content-Type: application/x-www-form-urlencoded\r\n"); 
    strcat(message, "Content-Length: 10\r\n"); 
    strcat(message, "Accept-Charset: utf-8\r\n\r\n"); 
    strcat(message, "arg1=Hello"); 




    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'; 
    puts(server_reply); 

    return 0; 
} 

Этот сценарий PHP:

<?php 
    echo "POST DATA : ".json_encode($_POST); 
?> 

Вот ответ:

Reply received 

HTTP/1.1 200 OK 
Date: Fri, 18 Nov 2016 10:34:21 GMT 
Server: Apache/2.4.18 (Win32) OpenSSL/1.0.2e PHP/7.0.8 
X-Powered-By: PHP/7.0.8 
Content-Length: 14 
Content-Type: text/html; charset=UTF-8 

POST DATA : [] 

При попытке отправить данные Повсеместно Получ то будет работать хорошо, но для метода POST , PHP-скрипт не получает никаких данных от клиента.

+1

Два очевидных ошибок: 1) Линия терминатора для HTTP должен быть '\ г \ n'. 2) Ваш первый вызов 'strcat' должен быть' strcpy', поскольку 'message' еще не содержит никакой строки для конкатенации. –

+0

Я пытался с терминатором линии, но все еще не работает, любая идея снова?, Пожалуйста. –

+0

Если вы на 100% уверены, что проблема все еще существует, можете ли вы обновить код в вопросе, если бы эти две вещи были исправлены? (Таким образом, я могу убедиться, что вы исправили их правильно и чтобы другие люди не дали вам ответов, которые на самом деле не будут исправлять вашу проблему.) –

ответ

1

Thankyou Дэвид Шварц, это правильный код:

#include<stdio.h> 
#include<winsock2.h> 
#include <string.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[1024] , 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("127.0.0.1"); 
    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"); 

    // Work well with Get Method 
    // strcat(message, "GET /voleur/receiver.php?arg1=Hello HTTP/1.1\n"); 
    strcpy(message, "POST /voleur/receiver.php HTTP/1.1\r\n"); 
    strcat(message, "Host: 127.0.0.1:80\r\n"); 
    strcat(message, "Content-Type: application/x-www-form-urlencoded\r\n"); 
    strcat(message, "Content-Length: 16\r\n"); 
    strcat(message, "Accept-Charset: utf-8\r\n\r\n"); 
    strcat(message, "arg1=Hello World"); 




    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'; 
    puts(server_reply); 

    return 0; 
} 
+0

Итак, вы говорите, что вы изменили «Hello» на «Hello World», и он начал работать? Я что-то пропустил? – staringlizard

+0

@staringlizard См. Мой комментарий к вопросу. Я описал две ошибки в его коде, и он их исправил, а затем это сработало. –