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

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

25.06.2013, 13:20. Показов 5515. Ответов 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
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
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
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
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
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
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
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
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
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
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
3409 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
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
Ответ Создать тему
Новые блоги и статьи
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru