Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Концепция любого класса для работы с winsock 
:(
    Опции темы
En_t_end
Дата 17.10.2005, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



Mad
Цитата(Mad @ 17.10.2005, 16:58)
откуда такая инфа ?

Опять начинается ? smile
Было же уже обсуждение этого вопроса smile
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mad
Дата 17.10.2005, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 3
Всего: 19



En_t_end
Цитата(En_t_end @ 17.10.2005, 12:39)
Было же уже обсуждение этого вопроса

скинь сылку посмотреть


--------------------
user posted image
PM MAIL   Вверх
En_t_end
Дата 17.10.2005, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



PM MAIL ICQ Skype GTalk Jabber   Вверх
bel_nikita
Дата 17.10.2005, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 1
Всего: 47



Mad
Цитата
откуда такая инфа ?
Приведу лишь пару цитат:
Цитата
- В TCP нет видимой пользователю концепции «пакета». Он просто передает поток байтов, и нельзя точно предсказать, сколько байтов будет возвращено при очередном чтении.
- Из-за перегрузок в интенсивно используемой глобальной сети, особенно в Internet, данные могут доставляться как внезапно, так и пакетами неожиданного размера. Это требует от вас особой осторожности в допущениях о том, сколько данных может прийти в определенный момент и с какой частотой они поступают.


качаем и читаем: Йон Снейдер - Эффективное программирование TCP/IP


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Mad
Дата 17.10.2005, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 3
Всего: 19



bel_nikita
Цитата(bel_nikita @ 16.10.2005, 17:56)
Ведь в TCP первый высланный пакет может прийти последним

Цитата(bel_nikita @ 17.10.2005, 13:03)
В TCP нет видимой пользователю концепции «пакета».

И как по твоему эти две фразы стыкуютья ? smile

Цитата(bel_nikita @ 17.10.2005, 13:03)
нельзя точно предсказать, сколько байтов будет возвращено при очередном чтении

Это верно, поэтому я и привел примеры методов чтения нужного кол-ва байтов с ожиданием полного получения, но это не изменения порядка следования
Поясню

отправляем буффер (1,2,3,4,5,6}
при получении, могут быть такие варианты:
{1,2,3,4,5,6}
{1,2}{3,4,5}{6}
{1,2,3,4}{5,6} и т.д
но никогда не будет {1,2}{6}{3,4,5} или подобного


Это сообщение отредактировал(а) Mad - 17.10.2005, 14:16


--------------------
user posted image
PM MAIL   Вверх
bel_nikita
Дата 17.10.2005, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 1
Всего: 47



Mad
Цитата
И как по твоему эти две фразы стыкуютья ?
Так и знал, что-то вроде этого напишут smile Стыкуются. TCP/IP - и есть стЫк протоколов. Так или иначе данные TCP передаются посредством IP пакетов. И когда говорим TCP - подразумеваем TCP/IP.
Ну, лопухнулся немного smile Даже стыдно стало smile первый высланный пакет может прийти последним - это касается IP уровня smile


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Mad
Дата 21.10.2005, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 3
Всего: 19



Цитата(En_t_end @ 21.10.2005, 12:28)
    send(LSocket.sock, ltoa(SizeMess, buffer, 10), SizeMess, 0);

ты пытаешся послать SizeMess байт smile вместо длины получившегося размера

для такого протокола код будет такой :

Код

void sendlen(SOCKET sock, char *buff, unsigned long len)
{
    unsigned long sended = 0;
    while(sended < len)
        sended += send(sock, buff+sended, len-sended, 0);
}

void recvlen(SCKET sock, char *buff, unsigned long len)
{
    unsigned long recived = 0;
    while(recived < len)
        recived += recv(sock, buff+recived, len-recived, 0);
}

LSocket& operator <<(LSocket &LSocket,const char* message)
{
    unsigned long SizeMess = lstrlen(message);
    sendlen(LSocket.sock, &SizeMess, sizeof(unsigned long));
    sendlen(LSocket.sock, message, SizeMess);
    return LSocket;
}

LSocket& operator >>(LSocket &LSocket,char** buffer)
{
    unsigned long len;
    recvlen(LSocket.sock, &len, sizeof(unsigned long));
    *buffer = new char[len+1];
    memset(buffer, 0, len);
    recvlen(LSocket.sock, *buffer, len);
    return LSocket;
}



--------------------
user posted image
PM MAIL   Вверх
En_t_end
Дата 21.10.2005, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



Mad
Цитата(Mad @ 21.10.2005, 18:06)
ты пытаешься послать SizeMess байт

А.... теперь понятно, то есть здесь надо учитывать, что раз SizeMess - u_long - значит надо и послать размер сообщения размером с sizeof u_long. А я пытался преобразовывать размер к char*, а затем уже отсылать размер, опять же ошибочно забывая о том, что каждый символ - не есть один байт.
PM MAIL ICQ Skype GTalk Jabber   Вверх
Mad
Дата 21.10.2005, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

Репутация: 3
Всего: 19



Цитата(En_t_end @ 21.10.2005, 13:14)
А.... теперь понятно

Несовсем так, если ты посмотриш мой код, то увидиш
1. u_long парасылаеться как 4 байта в бинарном виде (нет смысла приобразовавыть его в текст)
2. по приему его клиент выделяет буффер по данные, с укзанным (в занчении u_long) размером
3. идет непосредственно пересылка данных.

в данном слечае совсем не важно что именно ты пересылаеш, текст или бинарные данные

кстати, в случае с текстом, можно упростить алгоритм:
отправитель - отсылает текстовый буфер вместе с завернающим 0x0 байтом
получатель - читает поток побайтно, пока не встретит байт 0x0 smile


--------------------
user posted image
PM MAIL   Вверх
En_t_end
Дата 22.10.2005, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2074
Регистрация: 4.12.2004

Репутация: нет
Всего: 20



Mad
Цитата(Mad @ 21.10.2005, 18:32)
отправитель - отсылает текстовый буфер вместе с завернающим 0x0 байтом
получатель - читает поток побайтно, пока не встретит байт 0x0

Я как не пробывал, не хочет отсылаться этот конечный байт smile Если видишь, то в я в своем классе даже добавил флаг, который отвечает за то, надо или нет добавлять в конец полученной строки нуль-терминатор.

ЗЫ спасибо! Вопросы у меня ещё есть, как сформулирую их получше - выложу.
Добавлено @ 10:37
Хотя нет... все таки можно и нужно отправлять нуль-терминатор. Просто нужно отправлять (lstrlen(message)+1)*sizeof(char) - столько байт
PM MAIL ICQ Skype GTalk Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0713 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.