Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
c-villain
0 / 0 / 0
Регистрация: 03.12.2010
Сообщений: 9
1

как принимать сообщение в сокетах

05.12.2010, 00:47. Просмотров 705. Ответов 1
Метки нет (Все метки)

здравствуйте, суть проблемы в следующем:
пишу оболочку для стандартной функции recv в сокетах.
эта функция должна принимать один параметр: буфер с сообщением который получил (out), а возвращать кол-во байт, которые получены.
Заранее размер сообщения для приема по тз знать необязательно.
Т.о. предлагаю мысль принимать сообщение постепенно (как-нить порциями), используя функцию select, которая смотрит в сокет поступают данные для получения или нет.
Чтобы не было утечки памяти наверняка надо использовать std::vector<char> для выходного буфера...

пока идеи воплощены в следующее (код пока не рабочий):
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
int TCPmsg::determineSocketStatus(BOOL RWflag, long timeToWaitInMilisec)
{
    fd_set Set; // Множество
    timeval time_out; // Таймаут
 
    FD_ZERO (&Set); // Обнуляем множество
    FD_SET (msgSock_, &Set); // Заносим в него наш сокет 
 
    time_out.tv_sec = 0; time_out.tv_usec = timeToWaitInMilisec; 
    if (RWflag == TRUE) return select (0, &Set, NULL, NULL, &time_out); //на отсыл
    return select (0, NULL, &Set, NULL, &time_out); //на прием!
}
size_t TCPmsg::RecvMsg(std::vector<char> buffer)
{
    int recvBytes = 0;
    int statusRes;
    int recvSize = 0;
    u_long availBytes;
    char ch;
    while ((statusRes = determineSocketStatus(TRUE, 10000)) > 0)
    {
        //recvBytes = recv(msgSock_, (char*) buffer, size, 0);
        int ret = ioctlsocket(msgSock_, FIONREAD, &availBytes);
        char* buff;
        recvBytes = recv(msgSock_, buff, availBytes, 0);
        if (recvBytes == SOCKET_ERROR) 
            throw SecureTransportException(RECV_MSG_ERROR);
        if (recvBytes > 0) buffer. //тут как-то надо из buff все залить в buffer
        
    }
    return recvBytes;
Просьба помочь, заранее спасибо.

Добавлено через 4 минуты
виноват, 24 строку закомментить)))

Добавлено через 20 минут
Хотя нет, все правильно...)))))
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.12.2010, 00:47
Ответы с готовыми решениями:

Нужно приложение которое будет отсылать и принимать небольшие сообщение по wifi
Здравствуй народ. нашел задачу которая меня так заинтересовала что уже 4 день не знаю с чего...

Консольное приложение способное принимать по сети сообщение
Здравствуйте! Я совершенно зеленый на данный момент (можно сказать 1-й класс), но есть одно...

Асинхронный сервер на сокетах.Как зациклить ?
Итак у меня есть код сервера который только принимает данные.Пожалуйста объясните в какой...

Как отключить пользователя по таймауту в асинхронных сокетах
Всем привет! Начал разбираться в сокетах на C#, сделал на синхронных, но переделываю на...

Тестирование на сокетах. Можно ли как-то выделить вопрос-ответ в отдельную функцию?
Хотелось бы узнать следующее... Есть сервер-сокет, и есть клиент-сокет. Если я на клиенте посылаю...

1
accept
4842 / 3263 / 465
Регистрация: 10.12.2008
Сообщений: 10,569
05.12.2010, 10:49 2
C++
1
2
3
4
5
6
7
8
struct chunk {
    unsigned char *data;
    size_t size;
};
 
...
 
    vector <chunk> v;
в функции принимаешь в какой-нибудь буфер
потом выделяешь память через new
туда переводишь данные из буфера
прикрепляешь эту память к такой структуре
в структуру также записываешь длину этих данных
потом добавляешь эту структуру в вектор через push_back
1
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.12.2010, 10:49

Как принимать PayPal платежи в России?
Привет всем! Как я понимаю, будучи гражданином России, у меня нет возможности открыть PayPal...

Как принимать ответ с кодировкой chunked
Картинка приходит с сервера со следующими хэдэрами: (Status-Line) HTTP/1.1 200 OK Date Sat, 01...

Как заставить QTcpSocket принимать данные?
Имеется приложение на Python, которое хотелось бы связать с одним приложением на C++. Использую Qt...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.