Проблема веб-сервера в C - PullRequest
       2

Проблема веб-сервера в C

0 голосов
/ 28 февраля 2011

Я написал веб-сервер на c, и он может установить соединение, введя http://localhost:8080/ в веб-браузере, но как мне продвинуться в проекте, чтобы я мог получить домашнюю страницу в браузере?

Единственное, что происходит сейчас, это то, что соединение принято, и больше ничего!Если вы хотите увидеть код, то так и скажите!

main(){

        WORD wVersionRequested;
        WSADATA wsaData;
        int err, ok, clientAddrLen, serverSocket, clientSocket;
        struct addrinfo *info;
        struct sockaddr clientAddr;


        wVersionRequested = MAKEWORD(2, 2);
        err = WSAStartup(wVersionRequested, &wsaData);


        //Creates a socket with 3 pre-defined values found in the libraries.
        serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        ok = getaddrinfo("127.0.0.1", "8080", NULL, &info);
        if(ok!=0) {
                WCHAR * error = gai_strerror(ok);
                printf("%s\n",error);
        }


        printf("Waiting for connection...\n");


        //Binds the port to the socket.
        ok = bind(serverSocket, info->ai_addr, info->ai_addrlen); 
        if(ok == SOCKET_ERROR) {
                err = WSAGetLastError();
                printf("%d\n",err);
        }
        ok = listen(serverSocket, SOMAXCONN);
        if(ok == SOCKET_ERROR) {
                err = WSAGetLastError();
                printf("%d\n",err);
        }


        //Creates new socket after another IP connects.
        clientAddrLen = sizeof(clientAddr);
        clientSocket = accept(serverSocket, &clientAddr, &clientAddrLen);


        printf("Connected!\n");

        //Sends a message on the new socket.
        sendMessage(clientSocket);
        printf("Message sent.\n");


        //Writes a log for the server.
        writeServerLog("127.0.0.1", " GET /HTTP1.1 C:/Server/index.html", "index.html", 100);


        getchar(); //Waiting for input, Used to stop the server before terminating.


        //Cleanup.
        closesocket(serverSocket);
        closesocket(clientSocket);
        WSACleanup();
}


void sendMessage(int socket){

        string message;


        message = "<html><body>Welcome to the server!</body></html>";
        send(socket, message, strlen(message), 0);
}


void writeServerLog(string ip, string recieved, string response, int sizeOfResponse){

        FILE *log;
        SYSTEMTIME st;


        GetSystemTime(&st);
        log = fopen("serverlog.txt", "a");
        fprintf(log, "IP: %s DaTi: %d-%d-%d %d:%d:%d Recv: %s Resp: %s Size: %d\n", ip, st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, recieved, response, sizeOfResponse);
        fclose(log);
}

Ответы [ 3 ]

3 голосов
/ 28 февраля 2011

Говорите HTTP или, по крайней мере, подделывайте.

1 голос
/ 28 февраля 2011

Когда вы получаете запрос из браузера, этот запрос может быть

GET /filename.ext HTTP/1.0
Host: ...
User-agent: ...
...

Вам необходимо выполнить поиск вашего filename.ext

Если .ext равен .htm или .html

Функция sendMessage должна отправлять

"HTTP/1.0 200 Ok\nConnection: close\nContent-type: text/html\nContent-length: 999999\n\n"

заменить 999999 фактической длиной вашего файла

отправить содержимое вашего файла

Если .ext равен .gif

Функция sendMessage должна отправлять

"HTTP/1.0 200 Ok\nConnection: close\nContent-type: image/gif\nContent-length: 999999\n\n"

заменить 999999 на фактическую длину вашего файла

отправлять содержимое вашего файла

И так далее

0 голосов
/ 28 февраля 2011

Получив соединение, вы просто должны проверить, какой файл запрашивает браузер, и отправить его.Например, когда вы впервые подключаетесь к веб-серверу, ваш браузер запрашивает что-то вроде GET HTTP/1.1 index, поэтому сервер должен отправить главную страницу.Он просто открывает, читает из него и send() возвращает.Затем браузер заглянет на эту страницу и снова спросит, находит ли он изображения / видео или что-то еще, наконец, он показывает страницу.Посмотрите здесь , это вам наверняка поможет.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...