powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сокеты. Ответ по http протоколу
6 сообщений из 6, страница 1 из 1
Сокеты. Ответ по http протоколу
    #38695685
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СОбрал код. Браузер должен получить ответ HELLO. программа запускается, принимает соединения,даже показывает сколько пользователей подключилось. Но браузер не получает ответа.

Код: plaintext
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.
#include <cstdlib>
#include <iostream>
#include "winsock2.h"

#define MY_PORT 89
using namespace std;

#define PRINTNUSERS if (nclients) printf("%d user online\n",nclients);else printf("No User on line\n");
DWORD WINAPI SexToClient(LPVOID client_socket);
int nclients = 0;

int main(int argc, char *argv[])
{
    char buff[1024];
    if (WSAStartup(0x0202,(WSADATA *) &buff[0]))
    {
        // Ошибка!
        printf("Error WSAStartup %d\n",WSAGetLastError());
        return -1;
    }
    
    SOCKET mysocket;
    if ((mysocket=socket(AF_INET,SOCK_STREAM,0))<0)
    {
        // Ошибка!
        printf("Error socket %d\n",WSAGetLastError());
        WSACleanup(); // Деиницилизация библиотеки Winsock
        return -1;
    }
    
    sockaddr_in local_addr;
    local_addr.sin_family=AF_INET;
    local_addr.sin_port=htons(MY_PORT); // не забываем о сетевом порядке!!!
    local_addr.sin_addr.s_addr=0;
    
    if (bind(mysocket,(sockaddr *) &local_addr, sizeof(local_addr)))
    {
        // Ошибка
        printf("Error bind %d\n",WSAGetLastError());
        closesocket(mysocket); // закрываем сокет!
        WSACleanup();
        return -1;
    }
    
    if (listen(mysocket, 0x100))
    {
        // Ошибка
        printf("Error listen %d\n",WSAGetLastError());
        closesocket(mysocket);
        WSACleanup();
        return -1;
    }
    
    printf("OZHIDANIE…\n");
    SOCKET client_socket; // сокет для клиента
    sockaddr_in client_addr; // адрес клиента (заполняется системой)

    // функции accept необходимо передать размер структуры
    int client_addr_size=sizeof(client_addr);
    // цикл извлечения запросов на подключение из очереди
    while((client_socket=accept(mysocket, (sockaddr *) &client_addr, &client_addr_size)))
    {
        nclients++; // увеличиваем счетчик подключившихся клиентов
        // пытаемся получить имя хоста
        HOSTENT *hst;
        hst=gethostbyaddr((char *) &client_addr.sin_addr.s_addr,4,AF_INET);
        // вывод сведений о клиенте
        printf("+%s [%s] new connect!\n",
        (hst)?hst->h_name:"",inet_ntoa(client_addr.sin_addr));
        PRINTNUSERS
        // Вызов нового потока для обслужвания клиента
        // Да, для этого рекомендуется использовать _beginthreadex
        // но, поскольку никаких вызов функций стандартной Си библиотеки
        // поток не делает, можно обойтись и CreateThread
        DWORD thID;
        CreateThread(0,0,SexToClient,&client_socket,0,&thID);
    }
    return 0;
    
    //---------------------------------------------
    //system("PAUSE");
    return EXIT_SUCCESS;
}

DWORD WINAPI SexToClient(LPVOID client_socket)
{
    SOCKET my_sock;
    my_sock=((SOCKET *) client_socket)[0];
    char buff[20*1024];
    #define sHELLO "Hello, Sailor\r\n"
    if (send(my_sock, "HTTP/1.1 200 OK\n", 16, 0) == -1)
    {
    printf("ERROR HTTP\r\n");
    return -1;
    }
    if (send(my_sock, "Server: 192.168.1.195\n", 16, 0) == -1)
    {
    printf("ERROR Server\r\n");
    return -1;
    }
    if (send(my_sock, "Content-Length: 5\n", 16, 0) == -1)
    {
    printf("ERROR Content-Length\r\n");
    return -1;
    }
    if (send(my_sock, "Content-Type: text/html\n\n", 16, 0) == -1)
    {
    printf("ERROR Content-Type\r\n");
    return -1;
    }
    if (send(my_sock, "HELLO", 16, 0) == -1)
    {
    printf("ERROR HELLO\r\n");
    return -1;
    }
    // отправляем клиенту приветствие
    //send(my_sock,sHELLO,sizeof(sHELLO),0);
    // цикл эхосервера: прием строки от клиента и возвращение ее клиенту
    int bytes_recv;
   /* while( ( bytes_recv=recv(my_sock,&buff[0],sizeof(buff),0)) &&    (bytes_recv !=SOCKET_ERROR)){
           send(my_sock,&buff[0],bytes_recv,0);
    }*/
    // если мы здесь, то произошел выход из цикла по причине
    // возращения функцией recv ошибки – соединение с клиентом разорвано
    nclients--; // уменьшаем счетчик активных клиентов
    printf("disconnect\n"); PRINTNUSERS
    // закрываем сокет
    closesocket(my_sock);
    return 0;
}



Может я где то не те параметры указал.
...
Рейтинг: 0 / 0
Сокеты. Ответ по http протоколу
    #38695740
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не так написал. Браузер должен получить сообщение от сервера, и вывести слово HELLO. Но он выводит ошибку что страниц не существует
...
Рейтинг: 0 / 0
Сокеты. Ответ по http протоколу
    #38695772
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КартежникМожет я где то не те параметры указал.
Ага. Причём - везде. Копипаст - опасная вещь. Почитай назначение третьего параметра у send().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сокеты. Ответ по http протоколу
    #38695811
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Ага. Причём - везде. Копипаст - опасная вещь. Почитай назначение третьего параметра у send().


Добавлю про "\r\n\r\n"-пустая строка между заголовком и данными в http, rfc
...
Рейтинг: 0 / 0
Сокеты. Ответ по http протоколу
    #38695846
Фотография Картежник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, ок спасибо, разобрался, заработало.Оказывается в качестве третьего параметра функции send нужно указывать длину строки, передаваемой в качестве второго параметра
...
Рейтинг: 0 / 0
Сокеты. Ответ по http протоколу
    #38695911
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КартежникОказывается в качестве третьего параметра функции send нужно указывать
длину строки, передаваемой в качестве второго параметра
О, сколько нам открытий чудных готовит чтение документации...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сокеты. Ответ по http протоколу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]