2016-11-18 4 views
0

Ich möchte eine HTTP-Post-Anfrage in C erstellen. Ich habe Erfolg, Get Methode zu senden, aber, wenn ich mit Post versuche, wird Programm einfach gestoppt. Hier ist der Code:Senden Sie HTTP-Post-Anfrage in 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 , 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"); 
    strcat(message, "POST /voleur/receiver.php HTTP/1.1\n"); 
    strcat(message, "Host: 127.0.0.1\n"); 
    strcat(message, "Connection: close\n"); 
    strcat(message, "Content-Type:application/octet-stream\n"); 
    strcat(message, "Content-Encoding:binary\n"); 
    strcat(message, "Content-Length:16\n"); 
    strcat(message, "Accept-Charset: utf-8\n\n"); 



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

    // My argument 
    char *data = "arg1=Hello"; 
    send(s , data , strlen(data), 0); 
    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

http://stackoverflow.com/questions/14551194/how-are-parameterss-sent-in--http-post-request – Holger

+1

Sie reservieren nie Speicher für "Nachricht". –

Antwort

1

Erstens: Soweit ich sehen kann, Ihr Problem:

strcat(message, "Content-Type:application/octet-stream\n"); 
strcat(message, "Content-Encoding:binary\n"); 
strcat(message, "Content-Length:16\n"); 

sollte

strcat(message, "Content-Type: application/octet-stream\n"); 
strcat(message, "Content-Encoding: binary\n"); 
strcat(message, "Content-Length: 16\n"); 

Zweite sein: Sie Ihre HTTP-Header umformatieren sollte liegt in folgenden Zeilen:

strcat(message, "Content-Length: 16\n"); 
[...] 
char *data = "arg1=Hello"; 
send(s , data , strlen(data), 0); 

weil Sie deklarieren, dass es 16 Bytes an Daten geben wird - aber Sie senden nur 10 Bytes, was dazu führt, dass der Server auf die verbleibenden 6 Bytes wartet.

+0

Es gibt keinen Unterschied zwischen dem ersten Block von 'strcat's und dem zweiten Block von' strcat's. Bitte korrigieren. –

+1

Ja gibt es - ich habe Leerzeichen zwischen den Doppelpunkten und den Header-Feldwerten hinzugefügt. –

+1

Oh, ja jetzt sehe ich es. Sie sollten das in Ihrer Antwort darauf hinweisen. –