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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2010, 11:05   #1
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию Проблема с передачей данных

Проблема состоит в следующем: работаю с сокетами, пытаюсь передать три строки от клиента к серверу по протоколу TCP. Привожу кусок кода из клиента:
Код:
char path_to_file[256],finded_str[1024],replace_str[1024];
	// чтение сообщений с texBOx'a

	strcpy_s(&path_to_file[0], sizeof(path_to_file), SysStringToChar(Source_File_Name_TextBox->Text)); 
	//передача имени файла серверу
	send(my_sock, &path_to_file[0], strlen(&path_to_file[0]), 0);

	strcpy_s(&finded_str[0], sizeof(finded_str), SysStringToChar(String_for_Search_TextBox->Text));
	//передача строки для поиска серверу
	send(my_sock, &finded_str[0], strlen(&finded_str[0]), 0);

	strcpy_s(&replace_str[0], sizeof(replace_str), SysStringToChar(String_For_Replace_TextBox->Text));
	//передача строки для замены серверу
	send(my_sock, &replace_str[0], strlen(&replace_str[0]), 0);
При трассировке данного кода получаю следующую картину (см. первое вложение)...
Далее кусочек кода сервера, где идет прием данных:
Код:
char finded_str[1024], replace_str[1024];
			 char path_to_file[256];
			 int bsize_path, bsize_finded, bsize_replace;
			 //прием запроса-пароля от клиента
			 while (1)
			{		
				// прием пути до файла
				int bsize_path = recv(my_sock,&path_to_file[0],sizeof(path_to_file),0);
				if (bsize_path == SOCKET_ERROR)
				{
					//сообщение об ошибке
					break;
				}				

				// прием строки для поиска
				int bsize_finded = recv(my_sock,&finded_str[0],sizeof(finded_str),0);
				if (bsize_finded == SOCKET_ERROR)
				{
					//сообщение об ошибке
					break;
				}				

				//прием строки для замены
				int bsize_replace = recv(my_sock,&replace_str[0],sizeof(replace_str),0);
				if (bsize_replace == SOCKET_ERROR)
				{
					//сообщение об ошибке
					break;
				}
					 path_to_file[bsize_path] = '\0';
					 finded_str[bsize_finded] = '\0';
					 replace_str[bsize_replace] = '\0';
Первая (path_to_file) строка приходит нормально(без завершающего нуля), а вот вторая строка (finded_str) приходит в виде "string_1string_2", хотя должно быть просто string_1, ну и после второго recv сервер виснет в ожидании третьей строки, хотя она была отослана,но почему-то пришла "склеенной" со второй. Подскажите, пожалуйста в чем может быть ошибка. Заранее спасибо!
Изображения
Тип файла: jpg error_1.jpg (24.8 Кб, 156 просмотров)
Тип файла: jpg error_2.jpg (17.0 Кб, 148 просмотров)
tools вне форума Ответить с цитированием
Старый 25.12.2010, 11:54   #2
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

Не понимаю, почему именно третья строка ко второй "клеится", а вторая к первой нет? Больше двух строк подряд передавать нельзя таким "прямым" способом из клиента? С UDP получалось передавать три строки таким же макаром. Может в клиенте указать что-нибудь наподобие ProcessMessages, как в delphi, для синхронизации. Или меня уже не в ту степь поперло? Подскажите пожалуйста?

Последний раз редактировалось tools; 25.12.2010 в 12:03.
tools вне форума Ответить с цитированием
Старый 25.12.2010, 13:36   #3
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Передавай вместе с 0лем на конце. Ну или ставь количество символов в строке перед самой строкой. Дело в том что при отправке данных через send протокол tcp может твои данные либо склеивать между собой либо наоборот делить, поэтому нельзя ожидать что ты отправил пакет1, пакет2, пакет3 и также точно их примешь. Единственное что протокол гарантирует - ты получишь данные в таком же порядке как отсылал и получишь их неповрежденными
UltimaBeaR вне форума Ответить с цитированием
Старый 25.12.2010, 13:57   #4
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

strcpy и так в конец ноль ставит, не в этом дело. А по второму варианту стоит подумать...

Последний раз редактировалось tools; 25.12.2010 в 14:09.
tools вне форума Ответить с цитированием
Старый 25.12.2010, 14:12   #5
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Цитата:
Сообщение от tools Посмотреть сообщение
strcpy и так в конец ноль ставит, не в этом дело
send(my_sock, &path_to_file[0], strlen(&path_to_file[0]), 0);

strlen(&path_to_file[0]) - длина не учитывает 0 на конце, а передаешь ты именно столько байт
UltimaBeaR вне форума Ответить с цитированием
Старый 25.12.2010, 14:49   #6
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

спасибо за подсказку, попробую реализовать ваши замечания
tools вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с передачей параметров Mira-girl Общие вопросы по Java, Java SE, Kotlin 2 22.11.2010 23:59
Проблема с передачей файла BleStaR C++ Builder 1 15.02.2010 20:37
Проблема с передачей значения в функцию steklyashka Помощь студентам 3 19.11.2009 22:19
Проблема с передачей данных методом POST Aiden Работа с сетью в Delphi 0 21.09.2008 21:11
Проблема с передачей куки arwm Работа с сетью в Delphi 7 28.12.2007 23:44