-2

Code::Blocks .c を使用して HTTP POST リクエストを送信しようとしましたが、メッセージの何が問題なのかわかりません。Google で検索すると、すべてのチュートリアルが私が行ったように行うように教えてくれます。誰かが私を助けてくれます。ありがとうございます。サイトへの私のリクエストは次のとおりです::

    sprintf(buffer, "POST /index.php HTTP/1.1\r\nContent-Lenght: %d\r\n", 7+strlen(action)+3+strlen(id));
strcat(buffer, "Host: www.testserv.com \r\n\r\n");
strcat(buffer, "action=");strcat(buffer, action);
strcat(buffer, "&");
strcat(buffer, "id=");strcat(buffer, id);

printf("Requisicao:\n%s\n\n", buffer);

send(s, buffer, strlen(buffer), 0);

リクエストは正しいようですが、彼女は何か間違ったことをしていませんか?

----EDITED--- 問題は次のとおりです: 私の投稿要求は機能しません。HTTP ヘッダーのみがサーバーによって解釈されますが、フォーム itens の値は解釈されません!

サイトの説明: サイトには index.php ページと、index.php によって呼び出される 2 番目のページ (send.php) があります。インデックスページには、2つのテキストボックス(アクションとID)と送信ボタンの3つのアイテムを持つフォームがあります。2つのテキストボックス(テスト用)に何かを書き込み、送信を押すと、POSTメソッドを介したフォームが送信を呼び出します.phpページとこのページには、2つのテキストボックスに書いたものが表示されます。サーバーに接続するための機能を示し、POSTメソッドでsend.phpを要求し、サーバーに渡そうとしますテキストボックスの変数の値。

完全な機能は次のとおりです。

int enviar(const char* action, const char* id){

#define ACTION "action="
#define ID "&id="

char head[500], buff_msg[500];
int s, len;
struct sockaddr_in inf;

if((s=socket(AF_INET, SOCK_STREAM, 0)) == -1)
    return -1;

inf.sin_family = AF_INET;
inf.sin_port = htons(80);
inf.sin_addr.s_addr = inet_addr("10.1.10.1");
memset(inf.sin_zero, 0, 8);

if(connect(s, (struct sockaddr*)&inf, sizeof(inf)) == -1)
    return -1;

memset(head, 0, 500);
memset(buff_msg, 0, 500);

sprintf(head, "POST /page_called_by_the_index.php / HTTP/1.1\r\nContent-Length: %d\r\n",
                                                    strlen(ACTION)+strlen(action)
                                                   +strlen(ID)+strlen(id));
strcat(head, "host: the_server.com\r\n\r\n");
strcat(head, ACTION);
strcat(head, action);
strcat(head, ID);
strcat(head, id);

printf("Header HTTP[%d]:\n%s\n", strlen(cab), cab);

len = send(s,head, strlen(cab), 0);

if(len <= 0){
    perror("send");
    return 0;
}

printf("%d bytes have been sent\n", len);

while((len=recv(s, buff_msg, 500, 0)) > 0){
    printf("%d bytes read:\n%s\n", len, buff_msg);
    memset(buff_msg, 0, 500);
}

return 1;}

サーバーから 200 OK が返されたため、ヘッダー リクエストは適切ですが、値が解釈されません。

助けてくれてありがとう。

4

1 に答える 1

4

POST コマンドにいくつかのエラーがあります

Content-Lenght

する必要があります

Content-Length

7+strlen(action)+3+strlen(id)

は 3 を想定すると 1 文字が短すぎます&id=(これには 4 文字が必要なので、コンテンツの長さは ID の最後の文字を省略します)。現在ハードコーディングしている長さの文字列に変数 (または定義) を使用した方が安全です。

#define ACTION "action="
#define ID "&id="

sprintf(buffer, "POST /index.php HTTP/1.1\r\nContent-Length: %d\r\n",
                sizeof(ACTION)-1+strlen(action)+sizeof(ID)-1+strlen(id));
strcat(buffer, "Host: www.testserv.com \r\n\r\n");
strcat(buffer, ACTION);
strcat(buffer, action);
strcat(buffer, ID);
strcat(buffer, id);
于 2013-07-02T13:59:05.340 に答える