Имеется простейший сокет сервер. Все вроде как работает, инициируется
соединение, скидывается дата и т.д.
Данные считываем так: nRead = Receive(buff, 4096);
Вот. И здесь секс. В большинстве случаев все работает нормуль, но когда
приходит строка вида:
Здравствуйте, 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 и останавливается
Здравствуйте, 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'у указывается сколько байт посылать
А вот если для вычесления размера посылаемого буфера применялась функция для подсчета длины строки — тогда да...
nix>По-моему, при отправке send() доходит до 0х00 и останавливается
Ну да, так в этом весь и секс
Клиентом является устройство, которое не заставишь кидать данные в определенном формате.........
Вопрос в том, можно ли как нибудь считать данные после 0х00?
Здравствуйте, Mogwai, Вы писали:
S>А повторные чтения не дочитывают остаток? Данные могут кусками идти.
M>Благодарю за внимание к вопросу. Повторные чтения вызывают подвисание
Они вызывают не подвисание, а блокирование до прихода новых данных.
Здравствуйте, 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 у тебя не строка случаем?
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
Здравствуйте, Mogwai, Вы писали:
IE>>а buff у тебя не строка случаем?
M>char buff[4096]; M>Возможно это дилетантский подход, но как было б вернее?
лутше было бы использовать void* buff = (void*)new char[4096];
в принципе и как сойдет.
Просто если у тебя nRead > length("1000000000"), что у тебя все считалось нормально. Вопрос в том как доступ к этому получить. Все функции работы со строками не признают все что расположено после '\0'.
Для визуальной проверки в режиме отладки посмотри, что расположено по адресу buff в памяти....
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
IE>лутше было бы использовать void* buff = (void*)new char[4096];
IE>в принципе и как сойдет. IE>Просто если у тебя nRead > length("1000000000"), что у тебя все считалось нормально. Вопрос в том как доступ к этому получить. Все функции работы со строками не признают все что расположено после '\0'.
А можно ли это как-нибудь обойти?
IE>Для визуальной проверки в режиме отладки посмотри, что расположено по адресу buff в памяти....
Здравствуйте, Mogwai, Вы писали:
IE>>лутше было бы использовать void* buff = (void*)new char[4096];
IE>>в принципе и как сойдет. IE>>Просто если у тебя nRead > length("1000000000"), что у тебя все считалось нормально. Вопрос в том как доступ к этому получить. Все функции работы со строками не признают все что расположено после '\0'.
Какое значение у nRead? M>А можно ли это как-нибудь обойти?
При работе со строкой учитывать реальный размер записанных в нее данных (в твоем случае это nRead)...
IE>>Для визуальной проверки в режиме отладки посмотри, что расположено по адресу buff в памяти....
M>0x0012ebd4 "1000000000"
а после что "1000000000" что в памяти?
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой
IE>Какое значение у nRead?
IE>При работе со строкой учитывать реальный размер записанных в нее данных (в твоем случае это nRead)...
IE>>>Для визуальной проверки в режиме отладки посмотри, что расположено по адресу buff в памяти....
M>>0x0012ebd4 "1000000000" IE>а после что "1000000000" что в памяти?
Точно!
nRead=51, а в буфере после 0х00 все остальные полезные данные
Можно тогда вопрос напоследок, как бы покрасивше их оттуда извлечь?
Здравствуйте, 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);
Один из самых обычных и ведущих к самым большим бедствиям соблазнов есть соблазн словами: "Все так делают".
Лев Толстой