Простой веб-сервер - PullRequest
       18

Простой веб-сервер

1 голос
/ 30 ноября 2011

Я пытаюсь написать простой веб-сервер HTTP, используя c, но продолжаю сталкиваться с проблемами при попытке его создать. Кажется, все в создании серверного сокета работает нормально; по сути, я просто не понимаю, как отправить материал в браузер. Вот отрывок из моего кода, в котором сервер зацикливается, чтобы создать сокетные соединения с клиентом, а затем отправлять данные на веб-страницу:

for (;;) /* Run forever */
    {
        /* Set the size of the in-out parameter */
        clntLen = sizeof(clntAddr);

        /* Wait for a client to connect */
        if ((clntSock = accept(servSock, (struct sockaddr *) &clntAddr,
                               &clntLen)) < 0)
            DieWithError("accept() failed");

        /* clntSock is connected to a client! */

        printf("Handling client %s\n", inet_ntoa(clntAddr.sin_addr));

        FILE *clientInput = fdopen(clntSock, "r");
        char input[1000];
        char html[BUFSIZE];

        fgets(input, 1000, clientInput);

        char  *token_separators = "\t \r \n";
        char *method = strtok(input, token_separators);
        char *requestURI = strtok(NULL, token_separators);
        char *httpVersion = strtok(NULL, token_separators);
        ...
        char requestMessage[] = "HTTP/1.0 200 OK\r\n\r\n";
        send(clntSock, requestMessage, strlen(requestMessage) + 1, 0);
        ...  

}

Я почти уверен, что мой код работает для создания сокетов и соединений, просто когда я пытаюсь отправить этот заголовок ответа, моя веб-страница просто пытается загрузить HTML. Когда я не отправляю заголовок ответа и не пытаюсь отправить обычный html, моя страница работает.

Я думаю, что я не понимаю, почему мой заголовок ответа не будет работать.

1 Ответ

0 голосов
/ 30 ноября 2011

Очень необычно видеть FILE * с розетками.Более типично использовать read / recv и write / send.Это позволяет вам легче обрабатывать ошибки.

Тем не менее, без заголовка браузер будет думать, что ваш сервер работает с HTTP / 0.9 - и все это HTML.Для того, чтобы все заработало правильно, добавьте еще:

HTTP/1.0 200 OK
Content-Type: text/html;charset=iso-8859-1

<html>
...

Конечно, в нем по-прежнему не хватает некоторых фрагментов, но это только начало, и большинство браузеров должны принять его без нареканий.Вы можете просмотреть RFC и найти методы запроса, которые вам нужно поддерживать (GET и HEAD), и заголовки ответа, которые вам необходимо создать (Server, Date).(Я надеюсь, что вы делаете это для целей обучения, а не для производства.)

Вы можете довольно легко протестировать ответы с помощью netcat:

$ cat file
HTTP/1.0 200 OK
Content-Type: text/plain

Hello, World
$ nc -l 8000 < file

Затем перейдите к http://localhost:8000Обратите внимание, что вышеперечисленное работает с BSD netcat, если у вас есть GNU netcat, вам нужно прочитать справочную страницу.

...