Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.05.2013, 22:47   #1
stranger1234
 
Регистрация: 23.01.2011
Сообщений: 3
По умолчанию Передача строк через ClientSocket ServerSocket

Доброго времени суток. Имеем две программы, одна является клиентом, вторая сервером, передаем строки считанные из разных фалов на программу сервер через сокеты. Проблема в следующем: строки считываются нормально, но при передаче иногда возникают проблемы: информация передается не полностью и/или не передается вообще и/или строки переданные по порядку могут сращиваться в одну. Отследить закономерность, при каких условиях это происходит не получается

Отправка с клиента
Код:
char f[80];
ifstream in_file("settings.ini", ios::in);
in_file.getline(f, 80);
in_file.close();
Socket->SendText(f);
TDateTime D=Now();
AnsiString da=DateToStr(D-1);
ifstream in_file2(da.c_str(), ios::in);
if (!in_file2)
{
        Socket->SendText("log#"+da+"#empty#");
}
else
{
        in_file2.getline(f,80);
        Socket->SendText("log#"+da+"#"+f+"#");
        in_file2.getline(f,80);
        if (f[0]!=NULL)
        Socket->SendText("log#"+da+"#"+f+"#");
}
in_file2.close();
Прием на стервере
Код:
AnsiString Rtext;
for (int i=0; i<ServerSocket1->Socket->ActiveConnections; i++)
 {
        Rtext = ServerSocket1->Socket->Connections[i]->ReceiveText();
        ListBox1->Items->Add(IntToStr(i)+": "+Rtext);
 }

Последний раз редактировалось stranger1234; 27.05.2013 в 22:54.
stranger1234 вне форума Ответить с цитированием
Старый 28.05.2013, 08:58   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Это нормальное поведение. TCP - это поток байтов нет гарантий, что байты будут получаться теми же группами, какими были отправлены.
Либо посылайте сначала размер строки, потом строку, либо вставляйте сепаратор между строками (например те же CRLF) и потом разбивайте на строчки.
waleri вне форума Ответить с цитированием
Старый 28.05.2013, 12:09   #3
Airhand
Пользователь
 
Аватар для Airhand
 
Регистрация: 23.08.2011
Сообщений: 55
По умолчанию

Все дело в том, что строки определяются до нулевого символа, его надо насильно записывать после строк. А сокеты «обрубают» его. Хорошим решением является, как уже сказал waleri передача размера строки, а ещё лучше передать не строку, а массив с размером. Я уже не помню деталей, но с размером не будет «склеивания» и «неверного» завершения.
"Пока бабка не смоет косметику, русский мужик не перекрестится" (C) Кто-то
Airhand вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ClientSocket, ServerSocket - проблема с передачей сообщения Karateka Работа с сетью в Delphi 6 27.05.2013 10:24
передача сообщений через serversocket и clientsocket virtuhay266 Помощь студентам 1 14.12.2011 22:54
Передача данных StringGrid через ServerSocket - ClientSocket Polotenchik Общие вопросы Delphi 4 18.03.2010 01:42
Реализация бана через ServerSocket и ClientSocket Sensizu Общие вопросы Delphi 0 04.01.2010 13:42
[TcpClient, TcpServer] или [ServerSocket, ClientSocket] работа через прокси DOLBY Работа с сетью в Delphi 2 17.09.2009 05:46