C HTTP-сервер / сброс соединения - PullRequest
0 голосов
/ 19 мая 2011

Я пытаюсь создать крошечный http-сервер в c, но я получаю CONNRESET ошибки с httperf, почему?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>

#include <unistd.h>
#include <errno.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <fcntl.h>

#define SOCKERROR -1

#define SD_RECEIVE 0
#define SD_SEND 1
#define SD_BOTH 2

int server;
int client;

...

int main(int argc, char *argv[])
{
    int status;

    int accepted;

    struct addrinfo hint;
    struct addrinfo *info;

    struct sockaddr addr;
    socklen_t addrsize;

    int yes = 1;

    ...

    // client

    addrsize = sizeof addr;

    while (1)
    {
        memset(&accepted, 0, sizeof accepted);
        memset(&addr, 0, sizeof addr);

        accepted = accept(server, &addr, &addrsize);

        if (accepted == SOCKERROR) {
            warn("Accept", errno);
        } else {
            shutdown(accepted, SD_SEND);
            close(accepted);
        }
    }

    // shutdown

    ...

    return EXIT_SUCCESS;
}

Ответы [ 2 ]

3 голосов
/ 19 мая 2011

Вы закрываете сокет, как только вы accept его. Таким образом, соединение сбрасывается на другом конце.

Если вы хотите поговорить с HTTP-клиентом, вам нужно будет проанализировать входящие HTTP-запросы и ответить действительными данными HTTP. (Предупреждение: это не тривиально.)

Пожалуйста, прочитайте эту статью: nweb: крошечный, безопасный веб-сервер (только статические страницы) Например, он содержит краткое изложение того, что нужно сделать для минимального HTTP-сервера.

1 голос
/ 19 мая 2011

ОК, спасибо за вашу помощь, я только что добавил это перед закрытием клиентского сокета, и больше нет ошибки CONNRESET:

char readBuffer[128];
char *sendBuffer = "HTTP/1.0 200 OK\r\n"
    "Content-Type: text/html\r\n"
    "Content-Length: 30\r\n\r\n"
    "<html><body>test</body></html>";

do {
    status = recv(accepted, readBuffer, sizeof readBuffer, MSG_DONTWAIT);
} while (status > 0);

send(accepted, sendBuffer, (int) strlen(sendBuffer), 0);
...