Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 811

Winsock2 в классе

12.01.2016, 08:32. Показов 2337. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил сделать класс для дальнейшего применения в разных программах вот что получилось:
Файл Konnekt.срр
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
#include "stdafx.h"
 
 
Konnekt::Konnekt(PCSTR a)
{   
    DEFAULT_PORT = a;
    ZeroMemory(&hints, sizeof(hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;
    aa = 0;
    
    recvbuflen = DEFAULT_BUFLEN;
}
 
LPVOID Konnekt::otkr_soketa()
{
    setlocale(LC_ALL, "Russian");
nahalo:
 
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if ( iResult != 0 )
    {
        std::cout <<"WSAStartup произошла ошибка инициализации при запуске блок "<< '\n';
        goto nahalo;
    }   
 
    // Resolve the server address and port
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if ( iResult != 0 )
    {
        std::cout << "getaddrinfo произошла ошибка инициализации при запуске (void блок) " << '\n';
        WSACleanup();
        goto nahalo;
    }
 
    // Create a SOCKET for connecting to server
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    if ( ListenSocket == INVALID_SOCKET )
    {
        std::cout << "WSAStartup socket произошла ошибка инициализации при запуске (void блок) " << '\n';
        freeaddrinfo(result);
        WSACleanup();
        goto nahalo;
    }
 
    // Setup the TCP listening socket
    iResult = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
    if ( iResult == SOCKET_ERROR )
    {
        std::cout << "bind произошла ошибка инициализации при запуске (void блок) " << '\n';
        freeaddrinfo(result);
        closesocket(ListenSocket);
        WSACleanup();
        goto nahalo;
    }
 
    freeaddrinfo(result);
 
    iResult = listen(ListenSocket, 0x100);//размер очереди  0x100
    if ( iResult == SOCKET_ERROR )
    {
        std::cout << "WSAStartup listen произошла ошибка инициализации при запуске (void блок) " << '\n';
        closesocket(ListenSocket);
        WSACleanup();
        goto nahalo;
    }//установление соединения с сокетом
    do//цикл подключение очередного сокета
    {
        std::cout << "Ожидаем подключение клиента" << '\n';
        ClientSocket = accept(ListenSocket, NULL, NULL); //ожидание подключения нового клиента
        
        std::thread новый_поток(&potok_новый);
        новый_поток.detach();//Отсоединение потока
        
    }
    while ( ClientSocket != INVALID_SOCKET );//закрытие цикла при ошибке инициализации сокета
    std::cout << "при ожидании нового клиента произошла ошибка " << '\n';
    closesocket(ClientSocket);
    WSACleanup();
    goto nahalo;
    return 0;
}
int Konnekt::priem_paketa()
{
    //проверка разрыва соединения
    struct tcp_keepalive alive;
    DWORD dwRet, dwSize;
    alive.onoff = 1;
    alive.keepalivetime = 1000;
    alive.keepaliveinterval = 100;
    dwRet = WSAIoctl(ClientSocket, SIO_KEEPALIVE_VALS, &alive, sizeof(alive),
                     NULL, 0, reinterpret_cast<DWORD*>(&dwSize), NULL, NULL);
    if ( dwRet == SOCKET_ERROR )
    {
        closesocket(ClientSocket);
        WSACleanup();
        std::cout << "Соединение закрыто  в структуре tcp_keepalive" << '\n';
        return 0;
    }
    int iResult = recv(ClientSocket, recvbuf, recvbuflen, 0);//чтение сообщение
    std::cout << "iResult = " << iResult << '\n';
    for ( int a = 0; a <= iResult; a++ )
    {
        std::cout << recvbuf[a] << " ";
    }
    std::cout << '\n';
    if ( iResult == INVALID_SOCKET )
    {
        closesocket(ClientSocket);//закрываем сокет из за ошибки 
        std::cout << "сокет закрыт " << '\n';
    }
    return 0;
}
 
void Konnekt::potok_новый()
{
    priem_paketa();
    //return 0;
}
Konnekt::~Konnekt()
{
    closesocket(ClientSocket);//закрываем сокет из за ошибки 
    closesocket(ListenSocket);
}
Файл Konnekt.h
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
#pragma once
#define DEFAULT_BUFLEN 1024//размер буфера приема
class Konnekt
{
public:
    PCSTR DEFAULT_PORT;
    WSADATA wsaData;
    SOCKET ListenSocket = INVALID_SOCKET;
    SOCKET ClientSocket = INVALID_SOCKET;
    struct addrinfo *result = NULL;
    struct addrinfo hints;
    int iResult;
    char recvbuf[DEFAULT_BUFLEN];
    int recvbuflen;
    int aa;
 
    
    Konnekt(PCSTR);
    LPVOID otkr_soketa();
    int priem_paketa();
    void potok_новый();
 
 
    ~Konnekt();
};
ну и майн:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "stdafx.h"
 
 
int main()
{
 
    Konnekt kon1("11000");//создаем объект и иницилизируем адресом порта
    kon1.otkr_soketa();//устанавливаем соединение
    
    system("pause");
    return 0;
}
Загвоздка получилась в создании потока в файле Konnekt.срр строка 75 std::thread новый_поток(&potok_новый);

Ошибка C2276 &: недопустимая операция с выражением привязанной функции-члена Consoleserver_1.0 C:\Users\Administrator\Desktop\Проекты\C onsoleserver_1.0\Consoleserver_1.0\Konne kt.cpp 76

Вроде поток оргонизовываю правельно... в чем проблема?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.01.2016, 08:32
Ответы с готовыми решениями:

winsock2.h
Компилирую обычный код: #pragma comment(lib, &quot;ws2_32&quot;) #include &lt;winsock2.h&gt; int main() { } Ошибки: 1&gt;------...

winsock2
Помогите, вот код: if(WSAConnect(sock, (SOCKADDR*)&amp;addr, sizeof(addr))) { cout &lt;&lt; &quot;Connected!&quot;; ...

Уроки по WinSock2 C++
Всем привет, решил записать небольшую серию уроков по сокетам в C++. Кому интересно вот видео: https://youtu.be/CRFNbq2pBxM Вот...

26
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 811
15.01.2016, 08:04  [ТС]
Студворк — интернет-сервис помощи студентам
Ну в продолжение, создал отдельный класс где описывается работа с клиентом. В маин реализовал цикл где запускаются потоки по мере подключения новых клиентов..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int main()
{
Konnekt kon1("11000");//создаем объект и иницилизируем адресом порта
    do
    {       
        Nev_potok_blok p;//создание нового объекта
        std::thread новый_поток(&Nev_potok_blok::connect, p, kon1.otkr_soketa());//kon1.otkr_soketa() возвращает
     //очередной открытый сокет
        новый_поток.detach();//Отсоединение потока
    } while ( true);
    system("pause");
    return 0;
}
Добавлено через 3 минуты
В принципе все работает.... но я еще с потоками только начинаю работать... реализация в правильном направлении?
0
50 / 31 / 4
Регистрация: 25.04.2013
Сообщений: 366
15.01.2016, 14:29
Попробуй нормально выбирать имена - это пишется по 100 раз в каждой книге для новичков...

Энтони Уильямс - Параллельное программирование на С++ в действии. 2012
0
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 811
15.01.2016, 14:44  [ТС]
немного переделал, чтобы куча не росла при закрытии потоков
C++
1
2
Nev_potok_blok* nem = new Nev_potok_blok;
        std::thread новый_поток(*nem, kon1.otkr_soketa(), nem);
и деструктор класса
C++
1
2
3
4
5
6
Nev_potok_blok::~Nev_potok_blok()
{
    closesocket(my_sock);//закрываем сокет из за ошибки 
    delete nem1;//удаление объекта класса
    std::cout << "Сработал диструктор  Nev_potok_blok::~Nev_potok_blok()" << '\n';
}
0
50 / 31 / 4
Регистрация: 25.04.2013
Сообщений: 366
15.01.2016, 15:00
А освобождать память кто будет??
0
11 / 15 / 8
Регистрация: 12.10.2011
Сообщений: 811
15.01.2016, 15:01  [ТС]
так вот в 4 строчке и удаляется... вроде....
здесь получаем указатель
C++
1
2
3
4
5
6
void Nev_potok_blok::operator()(LPVOID client_socket, Nev_potok_blok* nem)
{
    my_sock = ((SOCKET *)client_socket)[0];
    nem1 = nem;
    connect();
}
здесь удаляем...
C++
1
2
3
4
5
6
Nev_potok_blok::~Nev_potok_blok()
{
    closesocket(my_sock);
    delete nem1;
    std::cout << "Сработал диструктор  Nev_potok_blok::~Nev_potok_blok()" << '\n';
}
0
50 / 31 / 4
Регистрация: 25.04.2013
Сообщений: 366
15.01.2016, 15:20
//del
0
 Аватар для uhx
60 / 60 / 19
Регистрация: 11.07.2013
Сообщений: 305
15.01.2016, 15:52
Давайте начнем с начала. Ваш вопрос, как я понял, закрыт. Вы создали поток, проблема решена и тему можно закрывать.
По поводу вашего кода и "реализации". Она отвратительна. Если вы начинаете "только работать", то для начала попробуйте прочитать какие-либо статьи в интернете, таковых полно. Но вам не стоит сейчас лезть в потоки, попробуйте для начала узнать про ООП, про то, как следует правильно писать код.
Цитата Сообщение от eagl69 Посмотреть сообщение
potok_новый
Такое я вообще впервые вижу. Это выглядит убого, поверьте. На кириллице и транслите давать названия переменным/функциям - это ужасно. Это нечитаемо.
Уж извиняюсь, но я заглянул в ваши старые сообщения: год назад вы так же использовали goto и думали что в TCP есть "пакеты", что в корне неверно. Думаю, следует задуматься.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.01.2016, 15:52
Помогаю со студенческими работами здесь

winsock2 и dns
Подскажите как при использовании winsock2 можно узнать ip по dns-имени сайта? Язык c++.

Книги по winsock2
Здравствуйте! Посоветуйте книги для изучения сетевого программирования (winsock2) на C/C++. А так же интересует вопрос, можно ли будет...

WinSock и WinSock2
Подскажите книги,литературу по winsock и winsock2.Я не совсем новичек но въехать в сокеты немогу

Не работает WinSock2.h
Привет, у меня серьезная проблема: программа ругается на веб-программу. То есть я создаю простейший сервер на сокетах, но при компиляции...

Скачать изображение winsock2
Делаю запрос на сервер для скачивания изображения (сохранять его на комп не надо, нужно работать с ним в памяти). Сам запрос формируется...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
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