Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
28 / 10 / 1
Регистрация: 26.04.2010
Сообщений: 457
1

Сокеты, "кривые байты"

17.10.2013, 00:44. Показов 890. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При передаче от сервера клиенту посредством ServerSocket1->Socket->Connections[0]->SendBuf(sendbuf, sendcount), где sendbuf - это массив char размерностью 255, у клиента методом Socket->ReceiveBuf(recvbuf, Socket->ReceiveLength()) часть принимается правильно, а часть почему-то имеет отрицательные значения (предположительно те, которые больше 100). В чём может быть проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.10.2013, 00:44
Ответы с готовыми решениями:

Сокеты и клиент-сервер приложение, как отправлять/принимать байты
Здравствуйте, не могли бы пожалуйста привести пример клиент-сервер приложения. Клиент отправляет...

Написать программу, которая бы считывала из входного файла байты с N1 по N2 и с N3 по N4 и записывала эти байты в выходной файл
Здравствуйте!В убунту на Си нужно написать программу, которая бы считывала из входного файла байты...

Декодировать байты (в base64) в просто байты
Добрый день, нужно декодировать байты, которые зашифрованы в base64 в нормальные баты вот код : ...

Php сокеты и unix-сокеты
Здравствуйте, есть программа, написанная на С под Linux. При её работе в памяти хранятся несколько...

4
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
17.10.2013, 09:27 2
Видимо в том, что буфер при передаче режется на куски и вычитывать его
нужно в несколько вызовов ReceiveBuf.
0
28 / 10 / 1
Регистрация: 26.04.2010
Сообщений: 457
19.10.2013, 16:49  [ТС] 3
Убежденный,


на клиенте я делаю так:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define recv_length_2 6;
byte recv_length;
char recvbuf[255];
 
void __fastcall TForm1::clientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
char ch[2];
Socket->ReceiveBuf(ch, 1);
recv_length = ch[0];
if (recv_length != recv_length_2) {msg = ""; msg += FormatDateTime("hh",Now()) + ":" + FormatDateTime("nn",Now())+ ":" + FormatDateTime("ss",Now()) + " : Неверная длина сообщения у сервера (тип сообщения 0x2)"; Memo1->Lines->Add(msg); Button1->Enabled = true; ComboBox1->Enabled = true; return; }
for (int i=0; i<recv_length; i++) {Socket->ReceiveBuf(ch, 1); recvbuf[i] = ch[0];}
msg = ""; msg += FormatDateTime("hh",Now()) + ":" + FormatDateTime("nn",Now())+ ":" + FormatDateTime("ss",Now()) + " : Принятые байты от сервера: ";
for (int i=0; i<recv_length_2; i++) {msg += IntToStr(recvbuf[i]) += " "; }
Memo1->Lines->Add(msg);
}
В итоге опять же часть байтов кривые, отрицательные.

На сервере делаю так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char sendbuf[255];
byte sendcount;
 
sendcount = 6;
sendbuf[0] = sendcount;  //в первом байте передаю "размер сообщения", т.к. у клиента Socket->ReceiveLength() возвратит неверное число байт, если их больше одного
sendbuf[1] = count_proc >> 8;
sendbuf[2] = count_proc & 255;
sendbuf[3] = count_modules >> 8;
sendbuf[4] = count_modules & 255;
sendbuf[5] = count_threads >> 8;
sendbuf[6] = count_threads & 255;
sendbuf[7] = 0; //терминирующий ноль
 
ServerSocket1->Socket->Connections[0]->SendBuf(sendbuf, sendcount+1);
Кроме того, у клиента событие ClientRead происходит по непонятной причине два раза, следовательно лишний раз срабатывает условие if (recv_length != recv_length_2)
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
19.10.2013, 17:39 4
Для клиент-серверного приложения код весьма эм... необычный.
Кстати, почему сервер передает sendcount = 6, хотя в действительности он
пишет 7 байт, а не 6 ? И почему чтение из сокета идет по одному байту ?
Это ведь жутко неэффективно.
0
28 / 10 / 1
Регистрация: 26.04.2010
Сообщений: 457
19.10.2013, 19:32  [ТС] 5
Цитата Сообщение от Убежденный Посмотреть сообщение
Кстати, почему сервер передает sendcount = 6, хотя в действительности он
пишет 7 байт, а не 6 ?
мне кажется, не принципиально. уровень-то прикладной, так что смысл байтов ровно такой, какой сам им придашь. я как бы имел в виду количество информативных байт, хотя можно и общих.

Цитата Сообщение от Убежденный Посмотреть сообщение
И почему чтение из сокета идет по одному байту ?
Это ведь жутко неэффективно.
Цитата Сообщение от Убежденный Посмотреть сообщение
Видимо в том, что буфер при передаче режется на куски и вычитывать его
нужно в несколько вызовов ReceiveBuf.
до этого было Socket->ReceiveBuf(recvbuf, Socket->ReceiveLength()); но результат один.
и теперь ещё хардкорнее сделал: на сервере несколько вызовов ServerSocket1->Socket->Connections[0]->SendBuf(ch, 1);
и клиент подсчитывает возникающие события. Зато теперь гарантированно работает (кроме последнего байта в sendbuf, видимо холостым его надо делать).

Добавлено через 2 минуты
Цитата Сообщение от Убежденный Посмотреть сообщение
Для клиент-серверного приложения код весьма эм... необычный.
Необычность кстати не только в этом клиент выполняет две задачи: мониторит загрузку ЦП сервака и даёт команду на извлечение информации о процессах, которую тот в ответ будет пересылать

Добавлено через 19 минут
Убежденный, не, рано обрадовался.. опять отрицательные >:

Добавлено через 1 час 13 минут
Ошибка была в использовании char вместо unsigned char...
0
19.10.2013, 19:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2013, 19:32
Помогаю со студенческими работами здесь

Кривые на С++
Добрый день. Есть такая задача: имеются 4 точки на плоскости, их координаты известны. При условии,...

Кривые гильберта
Построить кривые Гильберта 3 и 4 порядка

Кривые Серпинского
Построить кривые Серпинского 1-го и 2-го порядков.

Кривые Безье
Задача: написать программу по изображению кривой Безье по заданным точкам. Опорные точки задаются...

Кривые Безье
Имеется задание: С помощью кубических кривых Безье нарисовать первую букву своего имени(Русский или...

Найти кривые
Помогите решить. Найти кривые, для которых сумма отрезков нормали MN и под нормали PN стала...

Кривые ip-адреса
Здравствуйте. Проблема в следующем. В локальной сети с недавнего время пропал интернет, все компы с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru