powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / И снова Sockets
17 сообщений из 17, страница 1 из 1
И снова Sockets
    #33093501
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, народ!

Итак...:)
У меня есть клиент и сервер.
Но я не знаю сейчас, какой длины я буду получать от клиента сообщения.
Может, по 50 байт, а может, намного больше.
А делать большой буфер для recv(...,buff,sizeof(buff),...) не очень хочется. Некрасиво:)
Делаю так:

...
while(bytes_recv != -1)
{
bytes_recv = recv(client_socket,buff,sizeof(buff),0);
printf("Prinyato %d \n",bytes_recv);

send(client_socket,buff,bytes_recv,0);
}
...

Получается как бы, что оно и не проблема. Ведь я получаю полное сообщение по частям, если буфера buff не хватает.(Если хватает, то все вообще хорошо)
Но...
И дальше идет вопрос:)
А как я узнаю, когда закончится дейтаграмма?
Как я отличу ее от следующей?
Если дописывать buffs один за другим, то когда остановиться?
Мне же надо собрать полное сообщение(Это код отладочный. Я тут просто смотрю, как работает все. На самом деле сообщение не будет отправляться обратно клиенту, а обрабатываться на сервере)

Наверняка, это как-то просто решается, но что-то порядочно загрузился, и никак не идет в голову ничего.
Можно, конечно, впереди сообщения дописывать его длину. Но это как-то...
Есть способ лучше?
...
Рейтинг: 0 / 0
И снова Sockets
    #33093538
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что не нравится?
Вообще есть два основных способа:
1) Самый часто используемый - первый байт/два байта/и тд отдаются под длину сообщения, потом идет само сообщение. Плюсы - легкость в работе, минус - целый байт тратится! :)
2) В конце сообщения идет специальный код. Либо однобайтовый, например EOF=Ctrl+Z=0x26. Либо комбинация которая заведомо не встретится внутри пакета, например для текстовых посылок часто используют двойной/тройной перевод строки, либо строку состоящую из какого-либо специального слова.

Можно еще и по третьему пути пойти - послал пакет, порвал связь :) Но это годится только для специфических задач.
...
Рейтинг: 0 / 0
И снова Sockets
    #33094145
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TnedutSПривет, народ!
Наверняка, это как-то просто решается, но что-то порядочно загрузился, и никак не идет в голову ничего.
Можно, конечно, впереди сообщения дописывать его длину. Но это как-то...
Есть способ лучше?

Почемуж некрасиво - очень даже неплохо :) Отводишь первые четыре байта под длину ;) Посмотри Http - там практически так и делается ;)

В принципе можешь в конце посылать маркер конца, например CRLF какой нить ;)
...
Рейтинг: 0 / 0
И снова Sockets
    #33094282
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Согласен.
Так и надо сделать.

Уж очень хотелось через select это провернуть. Идея даже есть, как это сделать.
И вот тут еще вопросик. Можно?

Начну с цитаты:
"Параметр readfds содержит сокеты, которые должны быть проверены на чтение. Если сокет находится в режиме прослушивания, то он будет помечен как готовый для чтения, в случае получения запроса на соединение, которое может быть принято функцией accept без блокировки. Для других сокетов, признак готовности к чтению будет означать, что очередь данных готова для чтения и чтение recv, WSARecv, WSARecvFrom или recvfrom не приведет к блокировке."
Я это понял так, что если сделать
...
int b = select(mysocket+1,&rfds,NULL,NULL,&tv);
printf("retval is %d\n",b);

bytes_recv = recv(client_socket,buff,sizeof(buff),0);
printf("Prinyato %d \n",bytes_recv);
...
, то пока на сервер не пойдут данные, "висим" на select. Как только клиент что-то шлет, select "открывается", и выполняется recv и далее.
Не выходит так.
Вишу на селекте даже когда данные идут. Вон, видите, даже таймаут поставить пришлось...
Я не так понял то, что прочитал?
Объясните, пожалуйста.
...
Рейтинг: 0 / 0
И снова Sockets
    #33094452
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TnedutSСогласен.
Так и надо сделать.

Уж очень хотелось через select это провернуть. Идея даже есть, как это сделать.


Лучше воспользуйся WSAEventSelect ;)
...
Рейтинг: 0 / 0
И снова Sockets
    #33094855
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не под win пишу.
Так что вроде как незя:(
...
Рейтинг: 0 / 0
И снова Sockets
    #33094917
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TnedutSЯ не под win пишу.
Так что вроде как незя:(

Перевёл сокет в неблокирующий режим через ioctlsocket ?
...
Рейтинг: 0 / 0
И снова Sockets
    #33094925
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в принципе есть неплохая книга по сокетам на 3 метра - если надо могу поделиться ;)
...
Рейтинг: 0 / 0
И снова Sockets
    #33095174
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давай сюда
tmv_@mail.ru
...
Рейтинг: 0 / 0
И снова Sockets
    #33095371
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, было бы здорово!
А то у меня уже возник дурацкий вопрос "А что это за функция":)
По почте сможешь? Просто всякие мулы у меня не прокатят - порты закрыты здесь.
oboima@mail.ru
Со своей стороны не могу, к сожалению, ничего особо ценного предложить. Ну разве что музыку. Только тогда скажи, куда лить.
...
Рейтинг: 0 / 0
И снова Sockets
    #33095374
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выкладывай на webfile.ru
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
И снова Sockets
    #33095386
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot maXmo]выкладывай на webfile.ru

Ух ты! Не знал! Спасибо, maXmo!
...
Рейтинг: 0 / 0
И снова Sockets
    #33095505
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вечером выложу книжку ;)
...
Рейтинг: 0 / 0
И снова Sockets
    #33095537
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TnedutS, да таких сервисов в инете тонны. webfile, кажется, первый русский.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
И снова Sockets
    #33095559
Интегратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИнтеграторВечером выложу книжку ;)

вот нашёл
http://forum.proglib.ru/group.asp?id=25&sortsrc=pop&sortbook=new&sortart=pop

devsock.zip
...
Рейтинг: 0 / 0
И снова Sockets
    #33095924
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Библиотека системного программиста. Том 31 .
Это что, большой труд?
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
И снова Sockets
    #33096224
TnedutS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да ясно, что тонны. Просто я их не знаю...:)

Интегратор, спасибо! Книжку скачал. Сайт в избранное добавил:)
Ну так что с музыкой? (Ой, что-то уже не по теме сообщения пошло:) )

Ладно. Еще раз всем спасибо
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / И снова Sockets
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]