Глупый вопрос по сокету......
От: Mogwai  
Дата: 16.06.03 15:43
Оценка:
Имеется простейший сокет сервер. Все вроде как работает, инициируется
соединение, скидывается дата и т.д.
Данные считываем так: nRead = Receive(buff, 4096);
Вот. И здесь секс. В большинстве случаев все работает нормуль, но когда
приходит строка вида:

1000000000.09/18:00,EOF,ACT|,PRI-CDR,n,MIN...(31 30 30 30 30 30 30 30 30 30
00 30 39 2F 31 38 3A 30 30 2C 45 4F 46 2C 41 43 54 7C 2C 50 52 49 2D 43 44
52 2
C 6E 2C 4D 49 4E 7F 0A 0D )

считывается только 1000000000 и все... А самое вкусное дальше....... Хельп!
Re: Глупый вопрос по сокету......
От: Signatec Россия  
Дата: 17.06.03 03:04
Оценка:
А повторные чтения не дочитывают остаток? Данные могут кусками идти.
Re: Глупый вопрос по сокету......
От: nix  
Дата: 17.06.03 06:32
Оценка: -1
Здравствуйте, Mogwai, Вы писали:

M>Имеется простейший сокет сервер. Все вроде как работает, инициируется

M>соединение, скидывается дата и т.д.
M>Данные считываем так: nRead = Receive(buff, 4096);
M>Вот. И здесь секс. В большинстве случаев все работает нормуль, но когда
M>приходит строка вида:

M>1000000000.09/18:00,EOF,ACT|,PRI-CDR,n,MIN...(31 30 30 30 30 30 30 30 30 30

M>00 30 39 2F 31 38 3A 30 30 2C 45 4F 46 2C 41 43 54 7C 2C 50 52 49 2D 43 44
M>52 2C 6E 2C 4D 49 4E 7F 0A 0D )

M>считывается только 1000000000 и все... А самое вкусное дальше....... Хельп!


А вы уверены, что отправляется вся строка, а не 1000000000???
По-моему, при отправке send() доходит до 0х00 и останавливается
Re[2]: Глупый вопрос по сокету......
От: Ed.ward Россия  
Дата: 17.06.03 06:45
Оценка:
Здравствуйте, nix, Вы писали:

nix>Здравствуйте, Mogwai, Вы писали:


M>Имеется простейший сокет сервер. Все вроде как работает, инициируется

M>соединение, скидывается дата и т.д.
M>Данные считываем так: nRead = Receive(buff, 4096);
M>Вот. И здесь секс. В большинстве случаев все работает нормуль, но когда
M>приходит строка вида:

M>1000000000.09/18:00,EOF,ACT|,PRI-CDR,n,MIN...(31 30 30 30 30 30 30 30 30 30

M>00 30 39 2F 31 38 3A 30 30 2C 45 4F 46 2C 41 43 54 7C 2C 50 52 49 2D 43 44
M>52 2C 6E 2C 4D 49 4E 7F 0A 0D )

M>считывается только 1000000000 и все... А самое вкусное дальше....... Хельп!


nix>А вы уверены, что отправляется вся строка, а не 1000000000???

nix>По-моему, при отправке send() доходит до 0х00 и останавливается

При отправке send'у указывается сколько байт посылать
А вот если для вычесления размера посылаемого буфера применялась функция для подсчета длины строки — тогда да...

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[2]: Глупый вопрос по сокету......
От: Mogwai  
Дата: 17.06.03 06:47
Оценка:
S>А повторные чтения не дочитывают остаток? Данные могут кусками идти.

Благодарю за внимание к вопросу. Повторные чтения вызывают подвисание
Re[2]: Глупый вопрос по сокету......
От: Mogwai  
Дата: 17.06.03 06:50
Оценка:
nix>По-моему, при отправке send() доходит до 0х00 и останавливается

Ну да, так в этом весь и секс
Клиентом является устройство, которое не заставишь кидать данные в определенном формате.........
Вопрос в том, можно ли как нибудь считать данные после 0х00?

Заранее благодарю.
Опечатка
От: Ed.ward Россия  
Дата: 17.06.03 06:53
Оценка:
Блин, конечно же вычисления



Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[3]: Глупый вопрос по сокету......
От: Ed.ward Россия  
Дата: 17.06.03 06:55
Оценка:
Здравствуйте, Mogwai, Вы писали:

S>А повторные чтения не дочитывают остаток? Данные могут кусками идти.


M>Благодарю за внимание к вопросу. Повторные чтения вызывают подвисание


Они вызывают не подвисание, а блокирование до прихода новых данных.

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[4]: Глупый вопрос по сокету......
От: Mogwai  
Дата: 17.06.03 07:01
Оценка:
EW>Они вызывают не подвисание, а блокирование до прихода новых данных.

Но считывания второго куска данных при этом не происходит
Re: Глупый вопрос по сокету......
От: IvEv  
Дата: 17.06.03 07:04
Оценка:
Здравствуйте, Mogwai, Вы писали:

M>Имеется простейший сокет сервер. Все вроде как работает, инициируется

M>соединение, скидывается дата и т.д.
M>Данные считываем так: nRead = Receive(buff, 4096);
M>Вот. И здесь секс. В большинстве случаев все работает нормуль, но когда
M>приходит строка вида:

M>1000000000.09/18:00,EOF,ACT|,PRI-CDR,n,MIN...(31 30 30 30 30 30 30 30 30 30

M>00 30 39 2F 31 38 3A 30 30 2C 45 4F 46 2C 41 43 54 7C 2C 50 52 49 2D 43 44
M>52 2C 6E 2C 4D 49 4E 7F 0A 0D )

M>считывается только 1000000000 и все... А самое вкусное дальше....... Хельп!


а buff у тебя не строка случаем?
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Re[2]: Глупый вопрос по сокету......
От: Mogwai  
Дата: 17.06.03 07:09
Оценка:
IE>а buff у тебя не строка случаем?

char buff[4096];
Возможно это дилетантский подход, но как было б вернее?
Re[3]: Глупый вопрос по сокету......
От: Ed.ward Россия  
Дата: 17.06.03 07:17
Оценка:
Здравствуйте, Mogwai, Вы писали:

IE>а buff у тебя не строка случаем?


M>char buff[4096];

M>Возможно это дилетантский подход, но как было б вернее?

А как ты вычисляешь размер пакета при посылке?

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[3]: Глупый вопрос по сокету......
От: IvEv  
Дата: 17.06.03 07:21
Оценка:
Здравствуйте, Mogwai, Вы писали:

IE>>а buff у тебя не строка случаем?


M>char buff[4096];

M>Возможно это дилетантский подход, но как было б вернее?
лутше было бы использовать void* buff = (void*)new char[4096];

в принципе и как сойдет.
Просто если у тебя nRead > length("1000000000"), что у тебя все считалось нормально. Вопрос в том как доступ к этому получить. Все функции работы со строками не признают все что расположено после '\0'.

Для визуальной проверки в режиме отладки посмотри, что расположено по адресу buff в памяти....
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Re[4]: Глупый вопрос по сокету......
От: Mogwai  
Дата: 17.06.03 07:21
Оценка:
M>>char buff[4096];
M>>Возможно это дилетантский подход, но как было б вернее?

EW>А как ты вычисляешь размер пакета при посылке?


Посылать я ничего не посылаю, только получаю
Данные шлет девайс-клиент самостоятельно, мне надо только их словить......
Re: Глупый вопрос по сокету......
От: Vamp Россия  
Дата: 17.06.03 07:57
Оценка:
Ты действительно уверен, что после 0x00 ничего нет? Строковые функции считают 0x00 кноцом строки, а данные там вполне могут быть... Проверь.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: Глупый вопрос по сокету......
От: Mogwai  
Дата: 17.06.03 08:08
Оценка:
IE>лутше было бы использовать void* buff = (void*)new char[4096];

IE>в принципе и как сойдет.

IE>Просто если у тебя nRead > length("1000000000"), что у тебя все считалось нормально. Вопрос в том как доступ к этому получить. Все функции работы со строками не признают все что расположено после '\0'.

А можно ли это как-нибудь обойти?

IE>Для визуальной проверки в режиме отладки посмотри, что расположено по адресу buff в памяти....


0x0012ebd4 "1000000000"
Re[5]: Глупый вопрос по сокету......
От: IvEv  
Дата: 17.06.03 08:21
Оценка:
Здравствуйте, Mogwai, Вы писали:

IE>>лутше было бы использовать void* buff = (void*)new char[4096];


IE>>в принципе и как сойдет.

IE>>Просто если у тебя nRead > length("1000000000"), что у тебя все считалось нормально. Вопрос в том как доступ к этому получить. Все функции работы со строками не признают все что расположено после '\0'.
Какое значение у nRead?
M>А можно ли это как-нибудь обойти?
При работе со строкой учитывать реальный размер записанных в нее данных (в твоем случае это nRead)...

IE>>Для визуальной проверки в режиме отладки посмотри, что расположено по адресу buff в памяти....


M>0x0012ebd4 "1000000000"

а после что "1000000000" что в памяти?
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Re[6]: Глупый вопрос по сокету......
От: Mogwai  
Дата: 17.06.03 09:12
Оценка:
IE>Какое значение у nRead?

IE>При работе со строкой учитывать реальный размер записанных в нее данных (в твоем случае это nRead)...


IE>>>Для визуальной проверки в режиме отладки посмотри, что расположено по адресу buff в памяти....


M>>0x0012ebd4 "1000000000"

IE>а после что "1000000000" что в памяти?

Точно!
nRead=51, а в буфере после 0х00 все остальные полезные данные

Можно тогда вопрос напоследок, как бы покрасивше их оттуда извлечь?

Еще раз выражаю свою благодарность.
Re[7]: Глупый вопрос по сокету......
От: IvEv  
Дата: 17.06.03 09:37
Оценка:
Здравствуйте, Mogwai, Вы писали:

IE>>Какое значение у nRead?


IE>>При работе со строкой учитывать реальный размер записанных в нее данных (в твоем случае это nRead)...


IE>>>>Для визуальной проверки в режиме отладки посмотри, что расположено по адресу buff в памяти....


M>>>0x0012ebd4 "1000000000"

IE>>а после что "1000000000" что в памяти?

M>Точно!

M>nRead=51, а в буфере после 0х00 все остальные полезные данные

M>Можно тогда вопрос напоследок, как бы покрасивше их оттуда извлечь?


M>Еще раз выражаю свою благодарность.


Например так....
char* data = buff + (strlen(buff) + 1);
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Re[8]: Глупый вопрос по сокету......
От: Mogwai  
Дата: 17.06.03 09:44
Оценка:
IE>Например так....
IE>
IE>char* data = buff + (strlen(buff) + 1);
IE>


Спасибо. Заработало. С меня пиво
Re: Продолжение сериала ;-)
От: Mogwai  
Дата: 18.06.03 12:57
Оценка:
Господа, не подскажете, как после того, как мы получили данные( nRead = Receive(buff, 4096); ) дать ответ клиенту, что мы их действительно получили?

Есть подозрение, что послать пакет без данных созначением flags в TCP header = 0х10.......... Хотя может быть это весьма глупое предположение.......

Заранее благодарю.
Re[2]: Продолжение сериала ;-)
От: Алексей Владимирович Миронов Россия  
Дата: 18.06.03 13:25
Оценка:
Здравствуйте, Mogwai, Вы писали:

M>Господа, не подскажете, как после того, как мы получили данные( nRead = Receive(buff, 4096); ) дать ответ клиенту, что мы их действительно получили?


TCP сам подтверждает получение пакетов.
... << RSDN@Home 1.0 beta 6a >>
Re[2]: Продолжение сериала ;-)
От: Ed.ward Россия  
Дата: 18.06.03 13:53
Оценка:
Здравствуйте, Mogwai, Вы писали:

M>Господа, не подскажете, как после того, как мы получили данные( nRead = Receive(buff, 4096); ) дать ответ клиенту, что мы их действительно получили?


M>Есть подозрение, что послать пакет без данных созначением flags в TCP header = 0х10.......... Хотя может быть это весьма глупое предположение.......


M>Заранее благодарю.


Если соединение происходит по TCP то ответ отсылается автоматически.
А если по UDP, то нужно придумать какой-нить пакетик для обозначения что все дошло нормально и отсылать его, а на другой стороне его ловить и анализировать.

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[2]: Продолжение сериала ;-)
От: Ed.ward Россия  
Дата: 18.06.03 13:54
Оценка:
Здравствуйте, Mogwai, Вы писали:

M>Господа, не подскажете, как после того, как мы получили данные( nRead = Receive(buff, 4096); ) дать ответ клиенту, что мы их действительно получили?


M>Есть подозрение, что послать пакет без данных созначением flags в TCP header = 0х10.......... Хотя может быть это весьма глупое предположение.......


M>Заранее благодарю.


Если соединение происходит по TCP то ответ отсылается автоматически.
А если по UDP, то нужно придумать какой-нить пакетик для обозначения что все дошло нормально и отсылать его, а на другой стороне его ловить и анализировать.

Ed.ward
... << RSDN@Home 1.0 beta 7a >>
Re[3]: Продолжение сериала ;-)
От: Mogwai  
Дата: 18.06.03 13:54
Оценка:
АВМ>TCP сам подтверждает получение пакетов.

Извиняюсь за некорректную постановку вопроса.

Перефразирую: можно ли послать пакет без данных со значением flags в TCP header установленным мной?
Re[3]: Продолжение сериала ;-)
От: Mogwai  
Дата: 18.06.03 13:57
Оценка:
EW>Если соединение происходит по TCP то ответ отсылается автоматически.
EW>А если по UDP, то нужно придумать какой-нить пакетик для обозначения что все дошло нормально и отсылать его, а на другой стороне его ловить и анализировать.

Другая сторона — недокументированный темный лес
Приходится тыкаться всяко-разно чтоб она поняла, что ее данные приняты............
Re[4]: Продолжение сериала ;-)
От: Алексей Владимирович Миронов Россия  
Дата: 18.06.03 14:08
Оценка:
Здравствуйте, Mogwai, Вы писали:

M>Другая сторона — недокументированный темный лес


Другая сторона должна соответствовать RFC. Если это не так

M>Приходится тыкаться всяко-разно чтоб она поняла, что ее данные приняты............


Чтобы она "быстрее понимала", можно отключить алгоритм Найгля, но это, по-моему, некрасивое решение.
... << RSDN@Home 1.0 beta 6a >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.