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

Как ускорить работу сокетов?

25.06.2013, 13:20. Показов 5454. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день,

Руководитель дал задание на практику написать приложение на C/C++ - Генератор/Анализатор трафика. Ранее я писал что-то подобное, только на C# с использованием асинхронных сокетов.

Попробывал обычные сокеты (connect, send, recv) - работает медленно, нужна скорость хотя бы 1000 запрос/с. Далее поискал в Интернете - нашел пример неблокирующих сокетов, но как я понял - он работает только для сервера (эхо-сервер). Подскажите, как реализовать поставленную задачу?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.06.2013, 13:20
Ответы с готовыми решениями:

Как ускорить работу IJ?
Ребят, всем добрый день, я читал, что ява компилируется дольше, чем си, но у меня как-то долго... дайте пару советов, как ускорить работу:p

Как ускорить работу?
Прога ещё не доработана, сейчас интересует именно графический режим, когда нажимается клавиша 1-4 один из 4-х квадратов должен...

Как ускорить работу приложения?
У нас в компании есть приложение, для обработки входящих звонков. Написано на c# десктопом. Приложение тормозит. Какие есть...

21
Заблокирован
25.06.2013, 15:23
Какой такой анализатор без снифа? Задача неясна.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
25.06.2013, 16:47
Цитата Сообщение от sportsoft Посмотреть сообщение
работает медленно
впервые слышу покажите код
0
26 / 26 / 3
Регистрация: 13.04.2012
Сообщений: 61
25.06.2013, 18:39
Работает медленно в блокирующем режиме - это естественно.
Используйте неблокирующие сокеты, они подходят не только для сервера (эхо-сервер).
C# в итоге тоже использует неблокирующие сокеты.
1
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 12
25.06.2013, 19:02  [ТС]
Dr_Quake,

Какой такой анализатор без снифа? Задача неясна.
По заданию нужно анализировать ответы на созданные запросы. Для чего в этом случае сниффер, он ведь создает массу проблем
Именно от предшественника мне достался код, который, видимо, рассуждал как Вы. Посидел, подумал и понял, что проще все заново написать.

vxg,

впервые слышу покажите код
Это вполне логично, т.к. передача данных занимает время, а программа ожидает его окончания. Код можно посмотреть в RSDN - там я смотрел примеры.

Unwebo,

Используйте неблокирующие сокеты, они подходят не только для сервера (эхо-сервер).
А как это сделать? Сервер создает сокет и устанавливает его в неблокирующий режим:

C++
1
2
 listener = socket(AF_INET, SOCK_STREAM, 0);
 fcntl(listener, F_SETFL, O_NONBLOCK);
А для клиента как? Вот это мне и нужно...
0
Заблокирован
25.06.2013, 20:18
Асинхронная работа с WS - тема нескольких глав книги... Книг несколько, смотри сам, будут конкретные вопросы - уже тут, хотя там не вопросы, там банально подбор после прохода по этим граблям.
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 12
26.06.2013, 08:57  [ТС]
Цитата Сообщение от Dr_Quake Посмотреть сообщение
Асинхронная работа с WS - тема нескольких глав книги... Книг несколько, смотри сам, будут конкретные вопросы - уже тут, хотя там не вопросы, там банально подбор после прохода по этим граблям.
Меня интересовал как раз пример, либо ссылка на сайт или название книги с номером страницы. Такой ответ меня не устраивает.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
26.06.2013, 09:24
Цитата Сообщение от Unwebo Посмотреть сообщение
Работает медленно в блокирующем режиме
опять же - впервые слышу. пусть автор покажет пример. может у него там цикл в котором Sleep(500) после каждого пакета.
Цитата Сообщение от sportsoft Посмотреть сообщение
Это вполне логично, т.к. передача данных занимает время, а программа ожидает его окончания. Код можно посмотреть в RSDN - там я смотрел примеры.
никто не против того что передача занимает время. речь идет о том что стандартные сокеты якобы по какой то волшебной причине оказались медленнее того что реализовано на них же но в другой среде и неизвестным для автора способом.
----
так или иначе вот для примера клиент
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
//------------------------------------------------------------------------------
#include <winsock>
#include <stdio.h>
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data) || wsa_data.wVersion != 0x101) return -1;
 
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET) return -1;
 
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(2000);
    sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 
    printf("wait for server...\n");
 
    while (true)
    {
        int connect_res = connect(s, (SOCKADDR *)&sa, sizeof(sa));
        if (!connect_res) break;
 
        Sleep(250);
    }
 
    printf("connected\n");
 
    int messages_count = 100000;
    char message[1024];
 
    DWORD t = GetTickCount();
 
    for (int i = 0; i < messages_count; i++)
        if (send(s, message, sizeof(message), 0) == SOCKET_ERROR) return -1;
 
    printf("message size: %i\n", sizeof(message));
    printf("nessages count: %i\n", messages_count);
    printf("messages per second: %i\n", messages_count * 1000 / (GetTickCount() - t));
 
    closesocket(s);
 
    WSACleanup();
 
    system("pause");
    return 0;
}
а вот сервер
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
//------------------------------------------------------------------------------
#include <winsock>
#include <stdio.h>
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data) || wsa_data.wVersion != 0x101) return -1;
 
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET) return -1;
 
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(2000);
    sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 
    if (bind(s, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR) return -1;
    if (listen(s, SOMAXCONN) == SOCKET_ERROR) return -1;
 
    printf("wait for client...\n");
 
    while (true)
    {
        fd_set s_set;
        FD_ZERO(&s_set);
        FD_SET(s, &s_set);
        timeval timeout = {0, 0};
 
        int select_res = select(s + 1, &s_set, 0, 0, &timeout);
        if (select_res == SOCKET_ERROR) return -1;
        if (select_res) break;
 
        Sleep(250);
    }
 
    SOCKET ns;
 
    SOCKADDR_IN nsa;
    int sizeof_nsa = sizeof(nsa);
 
    ns = accept(s, (SOCKADDR *)&nsa, &sizeof_nsa);
    if (ns == INVALID_SOCKET) return -1;
 
    printf("connected...\n");
 
    char buffer[1024];
 
    int data_size = 0;
 
    while (true)
    {
        int recv_res = recv(ns, buffer, sizeof(buffer), 0);
        if (recv_res == SOCKET_ERROR) return -1;
        if (!recv_res) break;
        data_size += recv_res;
    }
 
    printf("data size: %i bytes\n", data_size);
 
    closesocket(ns);
    closesocket(s);
 
    WSACleanup();
 
    system("pause");
    return 0;
}
а вот результат работы клиента
----
wait for server...
connected
message size: 1024
nessages count: 100000
messages per second: 110253
----
несложно увидеть что
Цитата Сообщение от sportsoft Посмотреть сообщение
скорость хотя бы 1000 запрос/с
достигнута
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 12
26.06.2013, 12:05  [ТС]
Почему вы отправляете сообщения в один сокет? Для каждого запроса нужно открывать свое соединение, отправлять сообщение и считывать первые байты ответа.

PS: генератор трафика HTTP, сокеты - linux.
0
Заблокирован
26.06.2013, 12:09
Хм, а ты это, многопоточное программирование не осилил что ли? WSA_ASYNC нафиг не нужен в таком раскладе - много потоков должно быть у тебя.

И да, ты не знаешь основ TCP если пытаешься такое делать и потом на скорость жалуешься.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
26.06.2013, 13:48
Цитата Сообщение от sportsoft Посмотреть сообщение
Почему вы отправляете сообщения в один сокет
а где вы писали что нужно переподключаться? что мешает работать как Keep-Alive? переподключение конечно тащит за собой накладные расходы и не факт что сервер или клиент построены таким образом что бы мгновенно вас подключать.
клиент
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
//------------------------------------------------------------------------------
#include <winsock>
#include <stdio.h>
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data) || wsa_data.wVersion != 0x101) return -1;
 
    int messages_count = 3000;
    char message[1024];
 
    DWORD t = GetTickCount();
 
    for (int i = 0; i < messages_count; i++)
    {
        SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        if (s == INVALID_SOCKET) return -1;
 
        SOCKADDR_IN sa;
        sa.sin_family = AF_INET;
        sa.sin_port = htons(2000);
        sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 
        while (true)
        {
            int connect_res = connect(s, (SOCKADDR *)&sa, sizeof(sa));
            if (!connect_res) break;
        }
        if (send(s, message, sizeof(message), 0) == SOCKET_ERROR) return -1;
        closesocket(s);
        
        printf("message %i ok\n", i);
    }
 
    printf("message size: %i\n", sizeof(message));
    printf("nessages count: %i\n", messages_count);
    printf("messages per second: %i\n", messages_count * 1000 / (GetTickCount() - t));
 
    WSACleanup();
 
    system("pause");
    return 0;
}
сервер
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
//------------------------------------------------------------------------------
#include <winsock>
#include <stdio.h>
#include <conio.h>
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data) || wsa_data.wVersion != 0x101) return -1;
 
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET) return -1;
 
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(2000);
    sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 
    if (bind(s, (SOCKADDR *)&sa, sizeof(sa)) == SOCKET_ERROR) return -1;
    if (listen(s, SOMAXCONN) == SOCKET_ERROR) return -1;
 
    int data_size = 0;
    int i = 0;
 
    while (!kbhit())
    {
        fd_set s_set;
        FD_ZERO(&s_set);
        FD_SET(s, &s_set);
        timeval timeout = {0, 250};
 
        int select_res = select(s + 1, &s_set, 0, 0, &timeout);
        if (select_res == SOCKET_ERROR) return -1;
        if (select_res)
        {
            SOCKET ns;
 
            SOCKADDR_IN nsa;
            int sizeof_nsa = sizeof(nsa);
 
            ns = accept(s, (SOCKADDR *)&nsa, &sizeof_nsa);
            if (ns == INVALID_SOCKET) return -1;
 
            char buffer[1024];
 
            while (true)
            {
                int recv_res = recv(ns, buffer, sizeof(buffer), 0);
                if (recv_res == SOCKET_ERROR) return -1;
                if (!recv_res) break;
                data_size += recv_res;
            }
 
            closesocket(ns);
 
            printf("message %i ok\n", i++);
        }
    }
 
    printf("data size: %i bytes\n", data_size);
    
    closesocket(s);
 
    WSACleanup();
 
    system("pause");
    return 0;
}
дают ~330 подключений в секунду. если пытаться тестировать на общем количестве подключений больше 3200 затыкается. видимо система порты исчерпывает или не успевает освобождать. издевательство короче. можно еще попытаться по потокам разнести, но общей картины надругательства над принципами это не изменит - подобная лавина никогда не будет литься с переподключениями и так долго
0
Заблокирован
26.06.2013, 13:52
@vxg, всё просто - 65000 сокетов всего допустимы в IP для TCP, ибо сокеты привязаны таки(!!!) к портам. Для таких задач и тестов НЕЛЬЗЯ использовать TCP, дело в его принципе - минимум 4 пакета пинг-понга на установление сессии, минимум 2(controlled) на конец, на каждый делей сети L2 в 1 фрейм, выводы очевидны.
0
26.06.2013, 15:19

Не по теме:


Цитата Сообщение от Dr_Quake Посмотреть сообщение
НЕЛЬЗЯ
вопросы к автору

0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 12
26.06.2013, 16:43  [ТС]
Dr_Quake,
Хм, а ты это, многопоточное программирование не осилил что ли? WSA_ASYNC нафиг не нужен в таком раскладе - много потоков должно быть у тебя.
Процессор двухядерный, соответсвенно потоков может быть только 2! Соответсвенно скорость можно увеличить максимум в 2 раза!

65000 сокетов всего допустимы в IP для TCP, ибо сокеты привязаны таки(!!!) к портам
Гениальная идея, но я просил всего 1000 соединений :-)

vxg,
а где вы писали что нужно переподключаться? что мешает работать как Keep-Alive? переподключение конечно тащит за собой накладные расходы и не факт что сервер или клиент построены таким образом что бы мгновенно вас подключать.
дают ~330 подключений в секунду. если пытаться тестировать на общем количестве подключений больше 3200 затыкается. видимо система порты исчерпывает или не успевает освобождать. издевательство короче. можно еще попытаться по потокам разнести, но общей картины надругательства над принципами это не изменит - подобная лавина никогда не будет литься с переподключениями и так долго
По крайней мере программа должна работать и с Keep-Alive и без него. Ну вот, получается всего 330 соединений. Это при том, что сервер и клиент на одной машине. А если расстояние между серверами будет, например, от Москвы до США,в таком случае пакетов будет не 330, а максимум 5-10! А если еще добавить recv начала пакета, то будет максимум 4-9 :-)
0
Заблокирован
26.06.2013, 16:54
@sportsoft, извини, но с такими познаниями тебе нечего делать в программировании. Ты основ не знаешь.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
26.06.2013, 16:59
Цитата Сообщение от sportsoft Посмотреть сообщение
1000 соединений
все таки разберитесь что у вас там - соединения или пакеты или еще что-то. пока, действительно выглядит как каша. сформулируйте задачу более детально.
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 12
26.06.2013, 18:07  [ТС]
Dr_Quake,
Я бы воздержался от таких высказываний с Вашей стороны. Если Вы настолько умны, могли бы помочь не словом, а делом.

vxg,
Это была очепятка, но смысл ясен. Опять же, если это поможет, повторюсь:

Задание на практику написать приложение на C/C++ - Генератор/Анализатор трафика. Платформа - только Linux. Генератор должен отправлять только HTTP-пакеты (на данный момент). Каждый пакет - новое соединение. Анализ осуществляется путем обработки кода ответа HTTP на запрос и временем получения этого ответа.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
26.06.2013, 23:50
Цитата Сообщение от sportsoft Посмотреть сообщение
Задание на практику написать приложение на C/C++ - Генератор/Анализатор трафика. Платформа - только Linux. Генератор должен отправлять только HTTP-пакеты (на данный момент). Каждый пакет - новое соединение. Анализ осуществляется путем обработки кода ответа HTTP на запрос и временем получения этого ответа.
все это делает приведенный код. осталось только уточнить тысяч чего вам нужно в секунду? ибо открывая и закрывая сокеты тысячи раз в секунду ничего хорошего вы не достигните. вроде как что-то в потрохах может проломиться при таких фокусах. подробности можно узнать проанализировав ошибку выбрасываемую при остановке обмена после выдачи 3200 пакетов (сам я ее не смотрел, нужды не было, полагаю там что то вроде "нэт даун")
0
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 12
27.06.2013, 09:34  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
все это делает приведенный код. осталось только уточнить тысяч чего вам нужно в секунду? ибо открывая и закрывая сокеты тысячи раз в секунду ничего хорошего вы не достигните. вроде как что-то в потрохах может проломиться при таких фокусах. подробности можно узнать проанализировав ошибку выбрасываемую при остановке обмена после выдачи 3200 пакетов (сам я ее не смотрел, нужды не было, полагаю там что то вроде "нэт даун")
Именно так моя программа сейчас и работает. Я Вам написал в чем проблема в посте на этой странице от 16:43.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
27.06.2013, 13:04
Цитата Сообщение от sportsoft Посмотреть сообщение
Именно так моя программа сейчас и работает. Я Вам написал в чем проблема в посте на этой странице от 16:43
ты забыл указать дату если взять на вооружение фразу про то что программа будет соединяться с реальным удаленным ресурсом то ты вообще никогда не получишь таких психопатических скоростей потому как на той стороне сервер 1 работает с "продыхом" (задержкой между проверкой наличия входящих подключений) 2 упадет или забанит тебя на второй секунде как атакующего.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.06.2013, 13:04
Помогаю со студенческими работами здесь

Как ускорить работу макроса
Привет всем! Есть файл, там макрос. Макрос вычисляет наилучший доход. Макрос работает 10 минут. Это очень долго. Как ускорить работу...

Как ускорить работу JavaScript?
Может кто-нибудь знает как ускорить работу JavaScript? Размер скрипта 50 кб, перерисовка и заполнение комбобоксов идет достаточно медленно,...

Как ускорить работу программы
Доброго времени суток! Разработал первую программу для logo! на FBD. На симуляторе все нормально. После установки на оборудование...

Как ускорить работу с файлами?
Предполагается, что программа будет работать с файлами размера 300-500МБ. Эти обычные функции работают слишком медленно. Может быть стоит...

Как ускорить работу ffmpeg?
подскажите пожалуйста если кто знает как ускорить максимально работу ffmpeg? и насколько скорость будет зависеть ото железа?


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru