Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/55: Рейтинг темы: голосов - 55, средняя оценка - 4.93
1 / 1 / 0
Регистрация: 06.11.2012
Сообщений: 90

Http Сервер Winsock

17.11.2014, 22:15. Показов 10040. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Обьясните пожалуйста на пальцах как его реализовать(хотя бы операцию GET).Обычные TCP сервер и клиент реализовал без проблем.
Непонятно как будет происходить обработка команды get например из браузера.что сервер должен будет отправить браузеру при получении такой команды?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.11.2014, 22:15
Ответы с готовыми решениями:

Отправка файла (HTTP+Winsock)
Добрый вечер. Опять столкнулся с проблемой, которую без вашей помощи не разрешить. Суть дела - пишу программу для загрузки графических...

Winsock сервер
Тема поднималась неоднократно и на этом форуме, и во всём интернете в целом, однако однозначного ответа я так и не нашёл. У меня...

(Winsock) Сервер - Несколько клиентов
В msdn есть пример создания сервера, который принимает 1 соединение. Не могу врубиться, как сделать, чтобы к серваку подключалось...

8
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.11.2014, 23:01
Сервер отправляет стандартный HTTP-ответ: статусную строку, заголовки и
тело ответа (тело опционально, в зависимости от кода HTTP).

Пример запроса:
Code
1
2
3
4
5
GET /target.txt HTTP/1.1
Host: myserver.com
Accept-Charset: utf-8
Accept-Language: ru
(пустая строка)
Пример ответа:
Code
1
2
3
4
5
6
7
HTTP/1.1 200 OK
Connection: close
Content-Type: text/plain; charset=utf-8
Content-Language: ru
Content-Length: 5
 
Hello
1
Студент
 Аватар для MickeyBlueEyes
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
18.11.2014, 14:05
Переспрашивать будут, инфа соточка.
Code
1
2
3
4
5
GET /target.txt HTTP/1.1\r\n
Host: myserver.com\r\n
Accept-Charset: utf-8\r\n
Accept-Language: ru\r\n
\r\n
Code
1
2
3
4
5
6
7
HTTP/1.1 200 OK\r\n
Connection: close\r\n
Content-Type: text/plain; charset=utf-8\r\n
Content-Language: ru\r\n
Content-Length: 5\r\n
\r\n 
Hello
0
1 / 1 / 0
Регистрация: 06.11.2012
Сообщений: 90
18.11.2014, 21:28  [ТС]
Спасибо за помощь.Ещё вопрос возник как мне быть если я буду считывать из файла htm код и передавать браузеру и в нём обнаружится изображение типа <img src="URL" alt="альтернативный текст">.Если я правильно понимаю то браузер отправит Get запрос серверу чтобы он вернул ему это изображение.в каком виде сервер должен её отправить?Или может я не совсем правильно понимаю.

Добавлено через 1 час 56 минут
Или если я просто сделаю запрос localhost/test.jpg из браузера?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
18.11.2014, 22:01
Цитата Сообщение от LEBRON32RUS Посмотреть сообщение
Если я правильно понимаю то браузер отправит Get запрос серверу чтобы он вернул ему это изображение.
Правильно понимаете.

Цитата Сообщение от LEBRON32RUS Посмотреть сообщение
в каком виде сервер должен её отправить?
В двоичном. Ну то есть, сначала HTTP статусная строка и заголовки,
затем сама картинка (png, например).
0
1 / 1 / 0
Регистрация: 06.11.2012
Сообщений: 90
20.11.2014, 23:15  [ТС]
Доброго времени суток.Снова прошу помощи.у меня возникла проблема с сервером.он работает вполне нормально за исключением одного.после прохождения некоторого времени браузер перестает открывать страницу и появляется ошибка ERR_CONNECTION_REFUSED.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#pragma comment(lib, "Ws2_32.lib")
 
char html[] =
    "HTTP/1.0 200 OK\r\n"
    "Connection: close\r\n"
    "\r\n";
 
char document[2048];
char *buffer;
long lSize;
int documentPosition = 0;
 
WSADATA wsaData;
SOCKET sock;
int tcpPort = 60000;
int verbose = 1;
 
void sendRespond(SOCKET clientSock)
{
    char *tmp = new char[lSize+strlen(html)];
 
    int intlt = 0;
    for(; intlt < strlen(html); intlt++)
        tmp[intlt] = html[intlt];
 
    for(int i = 0; intlt < strlen(html) + lSize; intlt++, i++)
        tmp[intlt] = buffer[i];
 
    send(clientSock, tmp, intlt, 0);
}
 
bool loadFile(char* file)
{
    if(file[2] == 0)
        _snprintf(file, strlen(".\\index.html"), "%s", ".\\index.html");
    FILE *ptrFile = fopen(file, "rb");
    if(ptrFile == NULL)
        return false;
 
    fseek(ptrFile, 0, SEEK_END);
    lSize = ftell(ptrFile);
    rewind(ptrFile);
 
    buffer = new char[lSize];
    fread(buffer, sizeof(char), lSize, ptrFile);
    fclose(ptrFile);
    return true;
}
 
void carp(wchar_t* msg)
{
    fwprintf(stderr, L"%s\n", msg);
}
 
void exitService(wchar_t* msg)
{
    carp(msg);
    WSACleanup();
    exit(1);
}
 
int handleClient(SOCKET clientSock)
{
    char cCur = 0, cLast = 0, cBuf = 0;
    bool headersEnded = false;
    char reqHdr[1024] = { 0 };
    int reqHdrLen = 0;
 
    // Wait until we've actually received the end of the HTTP request headers
    // before we start sending our response...
    do {
        int count = recv(clientSock, &cBuf, 1, 0);
        if ( count == SOCKET_ERROR ) {
            carp(L"Could not recv from client");
            return 1;
        }
 
        if ( cBuf != '\r' && cBuf != '\b' ) {
            cLast = cCur;
            cCur = cBuf;
            if ( reqHdrLen < 1024 )
                reqHdr[reqHdrLen++] = cBuf;
        }
 
        if ( cCur == '\n' && cLast == '\n' )
            headersEnded = true;
    } while ( ! headersEnded );
 
    if ( verbose )
        printf("\n%s", reqHdr);
 
 
    char get[1024] = { 0 };
    int cursor = 0, target = 0;
    while(reqHdr[cursor++] != ' '){}
    get[target++] = '.';
    get[target++] = '\\';
    cursor++;
    while(reqHdr[cursor] != ' ')
        get[target++] = reqHdr[cursor++];
    if(strstr(get,".\\error"))
    {
        char* ptr = "HTTP/1.1 503 Service Temporarily Unavailable\r\nConnection: close\r\n\r\nSERVER PUT DOWN";
        send(clientSock,ptr,strlen(ptr),0);
 
        return 0;
    }
 
    ;
    if(loadFile(get))
        sendRespond(clientSock);
    else
    {
        char* ptr = "HTTP/1.1 404 File Not Found\r\nConnection: close\r\n\r\nNe NASHOL!";
        send(clientSock,ptr,strlen(ptr),0);
    }
    return 0;
}
 
int main(int argc, char* argv[])
{
    SOCKADDR_IN sockAddr;
    SOCKET clientSock;
    int i;
    if ( WSAStartup(MAKEWORD(2,2), &wsaData) != 0 )
        exitService(L"Winsock2 initialization failed");
 
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if ( sock == INVALID_SOCKET )
        exitService(L"Socket creation failed");
 
    sockAddr.sin_port = htons((u_short)tcpPort);
    sockAddr.sin_family = AF_INET;
    sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
 
    if ( bind(sock, (LPSOCKADDR)&sockAddr, sizeof(sockAddr)) == SOCKET_ERROR )
        exitService(L"Unable to bind TCP socket on this port");
 
    if ( listen(sock, 1000) == SOCKET_ERROR )
        exitService(L"Unable to listen");
 
    wprintf(L"Listening on port %d...\n", tcpPort);
 
    while ( clientSock = accept(sock, NULL, 0) ) 
    {
        if ( clientSock == INVALID_SOCKET ) 
        {
            closesocket(clientSock);
            exitService(L"Accept failed");
        }
        handleClient(clientSock);
        shutdown(clientSock, SD_BOTH);
        closesocket(clientSock);
    }
 
    return 0;
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
20.11.2014, 23:53
К этому коду можно высказать несколько претензий.
Не технически, а концептуально, так сказать.

1) Если вы работаете, как HTTP/1.1, то вы должны поддерживать
все характерные для этой версии протокола фичи.

А именно:

persistent connections. То есть, никаких "Connection:close",
соединение должно держаться, пока клиенту не "надоест".

request pipelining. Клиент (браузер) может отправить сразу
два, три или больше запросов, не дожидаясь ответа для
каждого из них. Сервер должен, как минимум, принять их все.

2) Content-Length использовать очень и очень желательно.
Иначе другая сторона не сможет точно определить, где конец
HTTP-сообщения (тем более, когда есть тело сообщения).

3) Принимать клиентов в одном потоке не только неэффективно,
это просто может застопорить сервер. Давайте представим:
браузер создает два соединения к серверу, по одному выкачивает
HTML-код, по второму всякие картинки, favicon и т.п.
Представьте, что сервер первым принял второе соединение
(которое для картинок), а браузер ничего не хочет по нему
отправлять, пока не начнется передача HTML (я такое видел).
Все, браузер "висит", сервер тоже.

4) Код не учитывает, что recv может вернуть 0.

Вообще, если Вы только-только начали писать клиент-серверы и
работать с HTTP, то все это довольно неплохо. Можете пока
забыть про пункт 1, но 2-4 обязательны, ваш HTTP-сервер
просто не будет нормально работать, пока не исправите.
И тестируйте сразу на разных браузерах, это позволяет быстро
обнаруживать всякие ошибки и специфическое поведение.
1
1 / 1 / 0
Регистрация: 06.11.2012
Сообщений: 90
21.11.2014, 01:09  [ТС]
спасибо большое.проблема была в 4м пункте.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
12.05.2021, 12:20
Цитата Сообщение от Убежденный Посмотреть сообщение
1) Если вы работаете, как HTTP/1.1, то вы должны поддерживать
все характерные для этой версии протокола фичи.

А именно:

persistent connections. То есть, никаких "Connection:close",
соединение должно держаться, пока клиенту не "надоест".
Это в http 2.0 вроде так, а в http 1.1 - если запроса keep-alive не было, сервер имеет право - "Connection:close".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.05.2021, 12:20
Помогаю со студенческими работами здесь

Многопоточный ТСР-сервер с использованием WinSock
При написании сервера столкнулся с некоторыми трудностями. Задача: написать ТСР-сервер, который мог бы обслуживать несколько клиентов...

TCP-эхо клиент-сервер (WinSock)
Здравствуйте! Подскажите, пожалуйста, почему TCP-эхо клиент-сервер неправильно работает? Сервер отправляет клиенту правильно только первую...

Клиент сервер Winsock + SDL. Форма клиента зависает
Проблема клиета: Форма SDL зацикливаеться циклом while и создается менюшка с кнопками и текстом тут все хорошо.Winsock тоже зацикливается...

Написать соединение: много клиентов - сервер (Winsock; на сервере 3 сокета: 2 TCP и 1 UDP)
Всем здрасьте !!!! Мне надо написать соединение: много клиентов - сервер Тут мне надо иметь на сервере 3 сокета: 2 TCP и 1 UDP ...

Http сервер
Здравствуйте, не могу разобрать как сделать так, чтобы в строке браузера можно было открыть html файл(127.0.0.1:8/file1.html). Файл должен...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru