Что не так с этой программой "простой-http-сервер" (код c) - PullRequest
0 голосов
/ 01 января 2011

Ниже приведен простой фрагмент кода, который я написал для демонстрации работы HTTP-сервера.Я скомпилировал его и запустил под Cygwin, но я не могу использовать веб-браузер для подключения к этому простому http-серверу.И после запуска простого http-сервера я все еще могу запустить apache на порту 80, и если apache не работает, «netstat -an» показывает, что порт 80 не занят.

Я написал еще одну простую программу, которая отправляетпростая строка "привет" на простом http-сервере, а затем получил ответы.

  1. Что не так с этой программой?почему я не могу подключить его с помощью веб-браузера, но я могу подключить его с помощью другой простой программы?

  2. Когда порт занят?После «bind» или «listen»?

  3. Если одно приложение использует порт определенного сетевого интерфейса (скажем, 192.168.2.1:80, предположим, существует более одного сетевого интерфейса),может ли другое приложение использовать тот же порт на другом интерфейсе (скажем, 192.168.55.1:80)?

  4. при запуске httpd, в списке процессов есть несколько процессов httpd, только одиниспользуя 0.0.0.0:80, если используется cygwin apache, другой httpd использует другой порт UDP?Зачем?


#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#include "sys/types.h"
#include "sys/socket.h"
#include "netinet/in.h"
#include "netdb.h"
#include "unistd.h"
#include "fcntl.h"


#define PORT 80

char HttpHeader[1000];

char HeaderTemplate[] =
    "HTTP/1.0 200 OK\r\n"
    "Server: PRIMITIVE Server\r\n"
    "Date: %s\r\n"
    "Content-Type: text/html\r\n"
    "Accept-Ranges: bytes\r\n"
    "Content-Length: %d\r\n\r\n";

char PageContent[] = "Hello World!";


char GMTNow[] = "11/15/14 00:59:00 GMT";
char ClntRequest[1000];   

struct sockaddr_in SocketAddress;
int ClntDescriptor;   /* socket descriptor to  client */
int SrvrDescriptor;   /* socket descriptor for server */

int main(int argc, char* argv[])
{
    sprintf(HttpHeader, HeaderTemplate, GMTNow, strlen(PageContent));

    SrvrDescriptor = socket(AF_INET, SOCK_STREAM, 0);
    SocketAddress.sin_family      =  AF_INET;
    SocketAddress.sin_port        =  PORT;
    SocketAddress.sin_addr.s_addr =  INADDR_ANY;
    bind(SrvrDescriptor, (struct sockaddr*)&SocketAddress, sizeof(SocketAddress));

    listen(SrvrDescriptor, 5);
    ClntDescriptor = accept(SrvrDescriptor, 0, 0);

    while (1)
    {
        recv(ClntDescriptor, ClntRequest, sizeof(ClntRequest), 0);
        printf("%s\n", ClntRequest);

        write(ClntDescriptor, HttpHeader, strlen(HttpHeader));
        write(ClntDescriptor, PageContent, strlen(PageContent));

        printf("%s", HttpHeader);
        printf("%s", PageContent);
    }

    close(SrvrDescriptor);

    return EXIT_SUCCESS;
}


Ответы [ 2 ]

1 голос
/ 01 января 2011

Порт в неправильном порядке байтов,

SocketAddress.sin_port        =  htons (PORT);
0 голосов
/ 01 января 2011
  1. Что не так с этой программой?почему я не могу подключить его с помощью веб-браузера, но могу подключить его с помощью другой простой программы?

    Скорее всего, ваш порт должен быть в сетевом порядке байтов.Используйте htons (PORT).

  2. Когда порт занят?После «связать» или «слушать»?После привязки.

  3. Если одно приложение использует порт определенного сетевого интерфейса (скажем, 192.168.2.1:80, предположим, существует более одного сетевого интерфейса), может ли другое приложение использовать тот жепорт на другом интерфейсе (скажем, 192.168.55.1:80)?Да.

...