Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189

Плохо работает recv

08.05.2019, 17:34. Показов 3114. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не кто не сталкивался с проблемой. recv читает первый раз хорошо все данные приходят как надо, на второй раз он читает в буфер 0, 0 читает столько сколько указано в 3 параметре и это длится бесконечно, то есть сокет не блокируется, при этом "Сервер" не чего не отправляет стоит на бреакпоинте.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.05.2019, 17:34
Ответы с готовыми решениями:

Интернет работает, но Chrome и IE не открывают сайты. Firefox работает, но плохо
Добрый день! У меня два компьютера получают интернет от одного роутера. На одном компьютере всё нормально, на втором началась такая...

Всего одна из страниц сайта плохо работает в IE и Мозилле (абра-кадабра).В Опере все работает.
Привет всем. Сделал небольшой сайтик на HTML и немножко СSS там присутствует. Это мой первый сайт. Состоит из десяти страничек....

Не работает или совсем плохо работает интернет
Здравствуйте! Что-то третий день уже на винде не работает интернет. Так иногда, если долго обновлять страницу, что-то откроется. А вот с...

33
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.05.2019, 17:47
Скорее всего, для блокирующих сокетов это означает, что коннект разорвался. Надо выходить из цикла чтения.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
14.05.2019, 17:24
Sierra26, так видимо как раз таки 3 параметр за каждый цикл чтения уменьшается на количество прочитаных байт, вот он в итоге начинает требовать читать по 0 байт после первого прочтения. Ошибка скорее в логике программы.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
14.05.2019, 19:06
код покажите.
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
15.05.2019, 10:13  [ТС]
GbaLog-,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
while(true)
    {
        if(recv(pWnd->m_hSocket, buf.buf, sizeof(DATA_INFO), 0) == SOCKET_ERROR)
        {
            pWnd->Disconnect();
            break;
        }
        PDATA_INFO pHead = (PDATA_INFO)buf.buf;
        if(pHead->m_dwKey != DATA_KEY)
            BREAK;
        buf.len = pHead->m_nLen;
        INT nResult;
        DWORD dwByteTransferred;
        DWORD dwFlags = 0;      
        if((nResult = recv(pWnd->m_hSocket, buf.buf, buf.len, 0)) == SOCKET_ERROR)
        //if((nResult = WSARecv(pWnd->m_hSocket, &buf, 1, &dwByteTransferred, &dwFlags, NULL, 0)))
        {
            pWnd->Disconnect();
            break;
        }
        ReadData(&buf, &nRequest, sizeof(nRequest));
дальше код обработки запроса
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
15.05.2019, 10:44
Цитата Сообщение от Sierra26 Посмотреть сообщение
if((nResult = recv(pWnd->m_hSocket, buf.buf, buf.len, 0)) == SOCKET_ERROR)
Если сервер разорвал коннект, то recv вернёт не SOCKET_ERROR, а 0
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
15.05.2019, 10:45  [ТС]
сейчас проверю
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
15.05.2019, 10:59  [ТС]
oleg-m1973, Нет, прочитал количество байт сколько нужно, но вот не то что передал сервер. nSocketResult == sizeof(DATA_INFO). На следующем recv действительно == 0. Я не понимаю почему он читает не то что передает сервер. Может слишком много передаю?
Миниатюры
Плохо работает recv  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
15.05.2019, 11:05
Цитата Сообщение от Sierra26 Посмотреть сообщение
oleg-m1973, Нет, прочитал количество байт сколько нужно, но вот не то что передал сервер. nSocketResult == sizeof(DATA_INFO). На следующем recv действительно == 0. Я не понимаю почему он читает не то что передает сервер. Может слишком много передаю?
Покажи весь код

Добавлено через 3 минуты
И что за сервер? Подозреваю, он отправляет данные и сразу разрывает коннект
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
15.05.2019, 11:14  [ТС]
первый рисунок это сервер. Стою на бреакпоинте первые два байта 0xc9 и 0x02 видно на скриншоте "Й" делаю шаг. Клиент считывает первые 2 байта как 0x00 и 0x00 рисунок 2 как это возможно?
Миниатюры
Плохо работает recv   Плохо работает recv  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
15.05.2019, 11:18
Цитата Сообщение от Sierra26 Посмотреть сообщение
Стою на бреакпоинте первые два байта 0xc9 и 0x02 видно на скриншоте "Й" делаю шаг.
Останавливать сервер в дебагере - это плохая идея. Пиши лучше в лог, то что оно отправляет, сам процесс не трогай.

Цитата Сообщение от Sierra26 Посмотреть сообщение
Клиент считывает первые 2 байта как 0x00 и 0x00 рисунок 2 как это возможно?
А в nSocketResult что?
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
15.05.2019, 11:24  [ТС]
nSocketResult == sizeof(DATA_INFO) то есть то что надо.

Добавлено через 2 минуты
Уточню: Сервер не блокирующейся, а клиент блокирующейся может в этом проблема?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
15.05.2019, 11:25
Убери на сервере overlapped, делай просто send
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
15.05.2019, 11:35  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Убери на сервере overlapped, делай просто send
Убрать не мог. Сервер должен работать не с одним клиентом. А потоками делать не стал, так как клиентов может быть очень много
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
15.05.2019, 11:55
Цитата Сообщение от Sierra26 Посмотреть сообщение
Убрать не мог. Сервер должен работать не с одним клиентом. А потоками делать не стал, так как клиентов может быть очень много
Сделай сначала, чтоб хотя бы с одним работал.
Ты сейчас пытаешься отлаживать клиента на непонятно как работающем сервере
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
15.05.2019, 12:01  [ТС]
Цитата Сообщение от Sierra26 Посмотреть сообщение
Убери на сервере overlapped, делай просто send
Не помогло. Все тоже самое
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
15.05.2019, 12:26
Цитата Сообщение от Sierra26 Посмотреть сообщение
Не помогло. Все тоже самое
Покажи код сервера
0
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
15.05.2019, 13:48  [ТС]
Это Пул
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
DWORD WINAPI ServerPoolThread(HANDLE hCompletionPort)
{
    PIO_DATA pOverlapped; // Структура асинхронного I/O
     DWORD dwFlags = 0;             // Флаги ф-ции WSARecv
    DWORD dwByteTransferred;
    ULONG nKey;
    while(true)
    {
        GetQueuedCompletionStatus(hCompletionPort, &dwByteTransferred, &nKey, (LPOVERLAPPED*)&pOverlapped, INFINITE);
        SOCKET hSocket = (SOCKET)pOverlapped->hIO;
        if(!dwByteTransferred)
        {           
            if(pOverlapped && pOverlapped->op_type != IO_DATA::OPERATION_SEND)
                delete pOverlapped;
            Dieconnect(hSocket);
            continue;
        }
        switch(pOverlapped->op_type)
        {
        case IO_DATA::OPERATION_RECV_HEAD:
            {
                PDATA_INFO pHead = (PDATA_INFO)pOverlapped->DataBuffer.buf;
                if(pHead->m_dwKey != DATA_KEY)
                {
                    Dieconnect(hSocket);
                    break;
                }
                PACKET_DATA packet;
                packet.hSocket = (SOCKET)pOverlapped->hIO;
                packet.DataBuffer.len = pHead->m_nLen;
                packet.DataBuffer.buf = new char[packet.DataBuffer.len];
                EnterCriticalSection(&g_PacketCS);
                g_ListPack.push_back(packet);
                LeaveCriticalSection(&g_PacketCS);
                pOverlapped->op_type = IO_DATA::OPERATION_RECV_PACKAGE;
                WSARecv(hSocket, &packet.DataBuffer, 1, &dwByteTransferred, &dwFlags, pOverlapped, 0);
                break;
            }
        case IO_DATA::OPERATION_RECV_PACKAGE:
            {
                SetEvent(g_hEventProcessingPacket);
                pOverlapped->op_type = IO_DATA::OPERATION_RECV_HEAD;
                WSARecv(hSocket, &pOverlapped->DataBuffer, 1, &dwByteTransferred, &dwFlags, pOverlapped, 0);
                break;
            }
        case IO_DATA::OPERATION_SEND:
            {
                int k = 6;
                //pOverlapped->DataBuffer.len = 0;
            }
        }   
    }
    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
DWORD WINAPI Server(CTSoftServer* pTSoftServer)
{
    SOCKET hServer;
    hServer = WSASocket(AF_INET, SOCK_STREAM, 0,NULL, NULL, WSA_FLAG_OVERLAPPED);
    SOCKADDR_IN sinServer;
    sinServer.sin_family = AF_INET;
    sinServer.sin_port = htons(PORT);
    sinServer.sin_addr.s_addr = INADDR_ANY;
    bind(hServer, (LPSOCKADDR)&sinServer, sizeof(sinServer));
    hostent *pHost;
    listen(hServer, 5);
    DWORD dwByteTransferred;
    DWORD dwFlags = 0;
    HANDLE hCompletionPort;
    hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);
    SYSTEM_INFO SystemInfo;
    GetSystemInfo(&SystemInfo);
    for(unsigned int i = 0; i < SystemInfo.dwNumberOfProcessors; i++)
    {
        HANDLE hThread;
        hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ServerPoolThread, hCompletionPort, 0, NULL);
        if(!hThread)
            return 0;
        CloseHandle(hThread);
        break;      //Пока пусть один поток обрабатывае данные по сети
    }   
    while(true)
    {
        SOCKADDR_IN sinClient;
        int nClientLen = sizeof(sinClient);
        PIO_DATA pIODataRecv = new IO_DATA;
        pIODataRecv->hEvent = 0;
        pIODataRecv->hIO = (HANDLE)accept(hServer,(struct sockaddr*)&sinClient, &nClientLen);
        pHost = gethostbyaddr ((PCHAR)&sinClient.sin_addr, 4, AF_INET);
        pIODataRecv->DataBuffer.buf = pIODataRecv->szBuffer;
        pIODataRecv->DataBuffer.len = SIZE_BUFFER;      
        pIODataRecv->op_type = IO_DATA::OPERATION_RECV_HEAD;
        CreateIoCompletionPort(pIODataRecv->hIO, hCompletionPort, 0, 0);
        EnterCriticalSection(&g_SocketCS);
        SOCKET_DATA sd;
        sd.hSocket = (SOCKET)pIODataRecv->hIO;
        if(pHost)
            lstrcpynA(sd.szClientName, pHost->h_name, SIZE_CLIENT_NAME); 
        else
            lstrcpyA(sd.szClientName,""); 
        g_SocketList.push_back(sd);
        LeaveCriticalSection(&g_SocketCS);
        WSARecv((SOCKET)pIODataRecv->hIO, &pIODataRecv->DataBuffer, 1, &dwByteTransferred, &dwFlags, pIODataRecv, 0);
    }
    return 0;
}
Функция передачи
C++
1
2
3
4
5
6
7
8
9
10
11
12
bool Send()
{
    DWORD dwNumberOfBytesSent;
    PDATA_INFO pHead = (PDATA_INFO)g_SendOverlApped.DataBuffer.buf;
    if(pHead->m_dwKey != DATA_KEY)
        BREAK;
    pHead->m_nLen = g_SendOverlApped.DataBuffer.len - sizeof(DATA_INFO);
    send((SOCKET)g_SendOverlApped.hIO, g_SendOverlApped.DataBuffer.buf, g_SendOverlApped.DataBuffer.len, 0);
    //WSASend((SOCKET)g_SendOverlApped.hIO, &g_SendOverlApped.DataBuffer, 1, &dwNumberOfBytesSent, 0, &g_SendOverlApped, NULL);
    g_SendOverlApped.DataBuffer.len = 0;
    return TRUE;
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
15.05.2019, 13:55
Цитата Сообщение от Sierra26 Посмотреть сообщение
Это Пул
Сделал бы простейший сервер listen()->accept()->send(). Чтобы отладить клиента.

И попробуй отправлять только один DATA_INFO, без данных, для проверки. Насколько я понимаю, DataBuffer.len у тебя довольно большой.
1
7 / 7 / 3
Регистрация: 04.06.2015
Сообщений: 189
15.05.2019, 14:00  [ТС]
а что будет если буфер recv переполнится?

Добавлено через 48 секунд
И как узнать размер буффера сокета?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2019, 14:00
Помогаю со студенческими работами здесь

Перехват API winsock32.recv - под отладчиком работает 100%, без отладчика - 50%
Добрый день, уважаемые Киберчане. Прошу Вашей поддрежки. Описание проблемы. Вызов функции CreateFileA, для записи буфера...

Не работает или плохо работает озу !
с недавнего времени стали такие проблемы ! - часто синий экран смерти пишет &quot;memory management&quot; - браузер Firefox...

Плохо работает Wi Fi
http://www.microprice.ru/product/a45M3o543043870634d456Ce Очень плохо видит сеть, другие компьютеры видят нормально. Что можно сделать?

Плохо работает роутер
Здравствуйте, я долго искал, куда можно обратиться по данному вопросу, попробую сюда) В общем купил роутер Wi-fi TRENDNET 652BRU, года...

Плохо работает include!
Здраствуйте, заранее спасибо кто поможет=))) Ситуация такая папка сайта www - (в ней страници , папка с программой, и другие...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru