powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Размер данных присылаемых по TCP в си.
20 сообщений из 20, страница 1 из 1
Размер данных присылаемых по TCP в си.
    #39095233
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Как определить в языке си размер данных приходящих по TCP протоколу? В данных передаваемых по протоколу размер передаётся только для одного блока, а таких блоков неизвестно сколько приходит, каких -то символов конца прихода данных не передаётся. Программа, которая передаёт эти данные сторонняя, изменить её не могу. Ну например же программа wireshark как-то это делает.
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39095240
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975таких блоков неизвестно сколько приходит, каких -то символов конца прихода
данных не передаётся
Ну так читай блоки пока коннект не закроется.

roma1975Ну например же программа wireshark как-то это делает.
Wireshark работает на уровне пакетов. Поток данных может быть разделён на пакеты в
произвольном месте.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39095248
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем случае - никак.
TCP это просто поток байт без начала и конца. TCP гарантирует только что байты придут в том же порядке в котором были отправлены.

Размеры блоков данных должны указываться внутри данных. Или какие-то маркеры начала и конца блока данных.
Читай документацию к той проге которая передает. Там все должно быть описано.
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39095261
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И как это сделать если можно на примере. У меня такой пример. Он не устраивает поскольку учитывает размер одного блока, а нам за раз, может приходить много блоков:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 while (1) {
  totalcnt = 0;
  kolbite = 4; 
  while(totalcnt < kolbite) {
  rc=recv(sock, &buf_lin2[totalcnt], kolbite - totalcnt, 0);
  if (rc<=0) {
  printf("Сервер не прочитал\n");
  break;
  }
  totalcnt += rc;
  if (totalcnt == 4) { // прочитали размер
  memcpy(&kolbite, buf_lin2, 4);
  kolbite += 4; // получаем размер всего блока данных
  if (kolbite > sizeof(buf_lin2)) {
  printf("Недостаточный размер буфера\n");
  break;
  }
  }
  }
  if (rc<=0 || kolbite > sizeof(buf_lin2) || kolbite <= 0) break;
  obrabwialonretr(buf_lin2, sock);
  break;
  }
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39095264
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И теряется часть информации.
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39095274
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Программа wialon retnslator там написано, что в блоке передаётся размер в первых 4 байтах, а блоков таких может и 1 и 2 и 3 , а может и больше быть из программы wireshark. Если не учесть все блоки то по ним информация может потеряться.
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39095283
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут пример 18334280 там весь топик про тот же виалон
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39095291
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975И как это сделать если можно на примере. У меня такой пример. Он не устраивает поскольку учитывает размер одного блока, а нам за раз, может приходить много блоков:

Код: plaintext
1.
2.
3.
4.
...
  obrabwialonretr(buf_lin2, sock);
  break;
  }


Мой исходный пример 18334280 был как раз на любое количество блоков, но ТС добавил break и стало работать только с одним блоком.
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39095306
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да это был я, сейчас я зарегистрировался и имя это взял. Ну давай я уберу break; Может действительно поможет. Спасибо попробую.
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39096511
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я сейчас сделал так. Почему -то не всегда отрабатывает строка когда блоки заканчиваются
Код: plaintext
1.
2.
 rc=recv(sock, &buf_lin2[totalcnt], kolbite - totalcnt, 0);
 if (rc<=0)...



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
 while (1)
 {
 totalcnt = 0;
 kolbite = 4; // сначала читаем размер
char buf_lin2[5000]="";
while(totalcnt < kolbite) {
rc=recv(sock, &buf_lin2[totalcnt], kolbite - totalcnt, 0);
if (rc<=0) {
printf("Сервер не прочитал\n");
break;
}
totalcnt += rc;
if (totalcnt == 4) { // прочитали размер
memcpy(&kolbite, buf_lin2, 4);
if (kolbite==0)
{
rc=-1;
break;
}
kolbite += 4; // получаем размер всего блока данных
if (kolbite > sizeof(buf_lin2)) {
printf("Недостаточный размер буфера\n");
break;
}
}
}
if (rc<=0 || kolbite > sizeof(buf_lin2) || kolbite <= 0) break;
obrabwialonretr(buf_lin2, sock);
}
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39096515
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И буду дальше тестировать программу как она ловит данные.
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39096538
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975Я сейчас сделал так. Почему -то не всегда отрабатывает строка когда блоки заканчиваются
Код: plaintext
1.
2.
 rc=recv(sock, &buf_lin2[totalcnt], kolbite - totalcnt, 0);
 if (rc<=0)...


Если соединение открыто, но данных из него не поступает, то программа будет стоять на recv() до тех пор пока что-нибудь не придет или соединение не будет закрыто с другой стороны или порвется.

Ты что хочешь получить? Как по твоему должно работать?

PS Правильно так написать
Код: plaintext
1.
2.
3.
4.
if (rc<=0) {
   printf("TCP-соединение закрыто\n");
   break;
}
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39096576
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так хотелось бы, чтобы программа работала так: считала все блоки данных, которые за раз от ретранслятора поступают мне - это программа делает, когда блоки закончились программа должна выйти
из циклов, но почему -то выход
Код: plaintext
1.
2.
3.
rc=recv(sock, &buf_lin2[totalcnt], kolbite - totalcnt, 0);
if (rc<=0) { 
........


не всегда отрабатывает и программа из цикла может не выйти, почему не знаю, сейчас пробую наблюдать за реальными приходящими данными

выход из циклов:
Код: plaintext
1.
2.
3.
4.
5.
6.
rc=recv(sock, &buf_lin2[totalcnt], kolbite - totalcnt, 0);
if (rc<=0) {
printf("Сервер не прочитал\n");
break;

if (rc<=0 || kolbite > sizeof(buf_lin2) || kolbite <= 0) break;



ниже у меня идет переоткрытие сокета
Код: plaintext
1.
2.
3.
............
close(sock);
  }



а выше циклов идёт
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
   listener = socket(AF_INET, SOCK_STREAM, 0);
   if(listener < 0)
	    {
	        perror("socket");
	        exit(1);
	    }
	    addr.sin_family = AF_INET;
	    addr.sin_port = htons(atoi(portchwialretr));
	   addr.sin_addr.s_addr = inet_addr(serverchten);
	    while (1)
	   	    	    {
	   	    	    	sleep(4);
	   	    	    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
	   	    	    {
	   	    	        perror("bind");
	   	    	    }
	   	    	    else
	   	    	    break;
	   	    	    }
	    listen(listener, 5);
            while(1)
	    {
	    	clilen = sizeof(cli_addr);
	    	sock = accept(listener, (struct sockaddr *)&cli_addr, &clilen);
	        if(sock < 0)
	        {
	            perror("accept");
	            exit(3);
	        }
           int rc,totalcnt,flagoshib,flagpervogchten;
...........
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39096595
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а вообще мне нужно все приходящие данные получать по протоколу wialonretranslator и чтобы программа могла их все принять, не пропускала.
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39096604
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ну да ты написал, что может оставаться на recv пока что-нибудь не придет или соединение не будет закрыто с другой стороны или порвется. Видать там не закрывается соединение.
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39096629
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975Видать там не закрывается соединение.
А это значит, что могут приходить пакеты данных ещё и ещё. Если ты хочешь принять их все,
без пропусков, тебе надо ждать пока они не придут.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39096638
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вроде она так сейчас и делает, ну посмотрим в реальности как оно будет дальше, просто может получиться так, как я вот сейчас проверял у себя подавая данные на порт и не закрывая соединение, если не происходит закрытие соединения передающей стороной, то последующие данные не принимаются принимающей стороной пока не произойдёт отсоединение передающей стороны. А это плохо неизвестно когда передающая сторона отсоединиться, сколько она всего накопит.
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39097119
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975,

дык приходящий поток надо парсить, а не складировать.
Иначе будут глюки, тормоза, нарушения функционирования при других условиях работы и прочие старинные, распространённые грабельки... для садо-мазо. тот кто ищет пакеты в потоковом протоколе
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39097927
roma1975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да всё нормально, я тут сам ошибся. Просто я запускал несколько программ передающих данных по одному порту, и смотрю почему же по позже запущенной программе принимающая программа не принимает данные. Так ведь программа будет принимать данные только от соединения первого с первой программы и это правильно, нормально. Чтобы принимались и с других соединений данные нужно строить мультипотоковый какой-то приём. Сейчас для проверки правильности приёма данных программой сделал посылку вторых данных в одной программе с задержкой, нормально приняла программа. Спасибо.
...
Рейтинг: 0 / 0
Размер данных присылаемых по TCP в си.
    #39097975
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roma1975Добрый день.

Как определить в языке си размер данных приходящих по TCP протоколу? В данных передаваемых по протоколу размер передаётся только для одного блока, а таких блоков неизвестно сколько приходит, каких -то символов конца прихода данных не передаётся. Программа, которая передаёт эти данные сторонняя, изменить её не могу. Ну например же программа wireshark как-то это делает.
Wireshark нельзя брать за образец TCP-приложения. Перед ней ставились задачи далеко идущие
за TCP-протокол (правильнее сказать что она охватывает более глубокий стек и видит больше).
Под Windows в частности Wireshark устанавливает нестандартный драйвер чтобы видеть больше
сведений.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Размер данных присылаемых по TCP в си.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]