0

httpリクエストからリクエストされたURLを把握する必要がありますが、何もないようです。

たとえば、これを入力すると

http://127.0.0.1:8080/heththethetkj909

リクエストにURLが含まれていません

GET /favicon.ico HTTP/1.1
Host: 127.0.0.1:8080
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.43 Safari/536.11
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

n-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

f-8;q=0.7,*;q=0.3

私のコードは

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>
#include <err.h>

char response[] = "HTTP/1.1 200 OK\r\n"
"Content-Type: text/html; charset=UTF-8\r\n\r\n"
"<doctype !html><html><head><title>Bye-bye baby bye-bye</title>"
"<style>body { background-color: #111 }"
"h1 { font-size:4cm; text-align: center; color: white;"
" text-shadow: 0 0 2mm black}</style></head>"
"<body><h1>Goodbye, world!</h1></body></html>\r\n";

int main()
{
    int one = 1, client_fd;
    struct sockaddr_in svr_addr, cli_addr;
    socklen_t sin_len = sizeof(cli_addr);

  char send_data [1024] , recv_data[2048]; 
      int  bytes_recieved ;  




    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0)
        err(1, "can't open socket");

    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(int));

    int port = 8080;
    svr_addr.sin_family = AF_INET;
    svr_addr.sin_addr.s_addr = INADDR_ANY;
    svr_addr.sin_port = htons(port);

    if (bind(sock, (struct sockaddr *) &svr_addr, sizeof(svr_addr)) == -1) {
        close(sock);
        err(1, "Can't bind");
    }

    listen(sock, 5);
    while (1) {
        client_fd = accept(sock, (struct sockaddr *) &cli_addr, &sin_len);
        printf("got connection\n");

                bytes_recieved = recv(client_fd,recv_data,2048,0);
                printf(recv_data);

        if (client_fd == -1) {
            perror("Can't accept");
            continue;
        }

        write(client_fd, response, sizeof(response) - 1); /*-1:'\0'*/
        close(client_fd);
    }
}
4

4 に答える 4

1

なんで?

HTTPリクエストの最初の2行には、次のようなものがあります。

GET /favicon.ico HTTP / 1.1
ホスト:127.0.0.1 :8080

これはに対応してい127.0.0.1:8080/favicon.icoます。

favicon.icoとは何ですか?ブラウザでstackoverflowにアクセスすると、アドレスバーの左側またはタブバーのページタイトルの左側にstackoverflowアイコンが表示されることに気づきましたか。それがファビコンです。ブラウザは、Webサイトにアクセスしたときにそれをロードし、画像として使用しようとします。ファビコンの詳細については、ウィキペディア-ファビコンを参照してください。

上記のように、このhttpリクエストは単にのためのものではありませんhttp://127.0.0.1:8080/heththethetkj909。したがって、あなたは確かにそれを見ることはありません。この場合、HTTPリクエストの最初の2行は次のようになります。

GET / heththethetkj909 HTTP / 1.1
ホスト:127.0.0.1 :8080

サーバーは、Webサーバーへの2つの接続を同時に開いている可能性があります。1つは、、もう1つ/heththethetkj909/favicon.ico。元のコードが複数の接続を処理しているように見えるため、なぜ問題が発生するのか実際にはわかりません。多分それはhttp持続性関連の問題です。

それを解決する方法は?

http応答のヘッダーに「Connection:close」を追加してみてください。それは役立つかもしれません。

これを処理しない非常に基本的な実装を試したいだけの場合は、ファビコンの読み込みのタイミング動作が異なる可能性のある別のブラウザ、ファビコンを認識しない非常に古いブラウザ、またはサーバーにアクセスするためのブラウザ(たとえばcurl http://127.0.0.1:8080/heththethetkj909、Linuxの場合、またはWindowsの場合はメモ帳)(はい、メモ帳の開いているダイアログでURLを入力できます)。

于 2012-10-21T03:58:55.240 に答える
0

ブラウザは2つのHTTPリクエストを送信します。

  1. ファビコンの場合-これはあなたが見るリクエストです。これは、ページタブの隅にあるクロムなどで表示される小さなアイコンです。
  2. 2番目のリクエストは、実際に入力したものになります。

両方が同じ接続で送信されるのか、2つのTCP接続で送信されるのかは覚えていません。お気に入りのネットワークスニファ(例:Wireshark-Windows / Linux、tcpdump-Linux)で確認できます。

于 2012-10-21T03:52:16.810 に答える
0

テストにブラウザを使用している変更はありますか?

http://en.wikipedia.org/wiki/Favicon

テストを実行しているときは、Curlを使用してみてください。

何かのようなもの:

curl http://127.0.0.1:8080/heththethetkj909
于 2012-10-21T03:54:07.603 に答える
0

この線

GET /favicon.ico HTTP/1.1

ブラウザがサイトのアイコン画像を取得しようとしていることを示します。これはあなたが興味を持っているリクエストではありません。また、次のような別のリクエストが表示されるはずです。

GET /heththethetkj909 HTTP/1.1
于 2012-10-21T03:55:16.820 に答える