|
|
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
Привет, народ! Итак...:) У меня есть клиент и сервер. Но я не знаю сейчас, какой длины я буду получать от клиента сообщения. Может, по 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 один за другим, то когда остановиться? Мне же надо собрать полное сообщение(Это код отладочный. Я тут просто смотрю, как работает все. На самом деле сообщение не будет отправляться обратно клиенту, а обрабатываться на сервере) Наверняка, это как-то просто решается, но что-то порядочно загрузился, и никак не идет в голову ничего. Можно, конечно, впереди сообщения дописывать его длину. Но это как-то... Есть способ лучше? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2005, 19:21 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
А что не нравится? Вообще есть два основных способа: 1) Самый часто используемый - первый байт/два байта/и тд отдаются под длину сообщения, потом идет само сообщение. Плюсы - легкость в работе, минус - целый байт тратится! :) 2) В конце сообщения идет специальный код. Либо однобайтовый, например EOF=Ctrl+Z=0x26. Либо комбинация которая заведомо не встретится внутри пакета, например для текстовых посылок часто используют двойной/тройной перевод строки, либо строку состоящую из какого-либо специального слова. Можно еще и по третьему пути пойти - послал пакет, порвал связь :) Но это годится только для специфических задач. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2005, 19:51 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
TnedutSПривет, народ! Наверняка, это как-то просто решается, но что-то порядочно загрузился, и никак не идет в голову ничего. Можно, конечно, впереди сообщения дописывать его длину. Но это как-то... Есть способ лучше? Почемуж некрасиво - очень даже неплохо :) Отводишь первые четыре байта под длину ;) Посмотри Http - там практически так и делается ;) В принципе можешь в конце посылать маркер конца, например CRLF какой нить ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 10:48 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
Согласен. Так и надо сделать. Уж очень хотелось через 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 и далее. Не выходит так. Вишу на селекте даже когда данные идут. Вон, видите, даже таймаут поставить пришлось... Я не так понял то, что прочитал? Объясните, пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 11:21 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
TnedutSСогласен. Так и надо сделать. Уж очень хотелось через select это провернуть. Идея даже есть, как это сделать. Лучше воспользуйся WSAEventSelect ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 12:08 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
Я не под win пишу. Так что вроде как незя:( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 13:44 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
TnedutSЯ не под win пишу. Так что вроде как незя:( Перевёл сокет в неблокирующий режим через ioctlsocket ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 14:02 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
в принципе есть неплохая книга по сокетам на 3 метра - если надо могу поделиться ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 14:04 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
Давай сюда tmv_@mail.ru ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 15:17 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
Да, было бы здорово! А то у меня уже возник дурацкий вопрос "А что это за функция":) По почте сможешь? Просто всякие мулы у меня не прокатят - порты закрыты здесь. oboima@mail.ru Со своей стороны не могу, к сожалению, ничего особо ценного предложить. Ну разве что музыку. Только тогда скажи, куда лить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 16:13 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
выкладывай на webfile.ru ------------------ - А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 16:14 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
[quot maXmo]выкладывай на webfile.ru Ух ты! Не знал! Спасибо, maXmo! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 16:17 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
Вечером выложу книжку ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 16:42 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
TnedutS, да таких сервисов в инете тонны. webfile, кажется, первый русский. ------------------ - А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 16:50 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
ИнтеграторВечером выложу книжку ;) вот нашёл http://forum.proglib.ru/group.asp?id=25&sortsrc=pop&sortbook=new&sortart=pop devsock.zip ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 16:58 |
|
||
|
И снова Sockets
|
|||
|---|---|---|---|
|
#18+
Библиотека системного программиста. Том 31 . Это что, большой труд? ------------------ - А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2005, 19:17 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33095374&tid=2033214]: |
0ms |
get settings: |
9ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
51ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 390ms |

| 0 / 0 |
