Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Размер данных присылаемых по TCP в си. / 20 сообщений из 20, страница 1 из 1
05.11.2015, 13:24
    #39095233
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
Добрый день.

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

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

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

Код: 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
05.11.2015, 13:41
    #39095264
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
И теряется часть информации.
...
Рейтинг: 0 / 0
05.11.2015, 13:45
    #39095274
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
Программа wialon retnslator там написано, что в блоке передаётся размер в первых 4 байтах, а блоков таких может и 1 и 2 и 3 , а может и больше быть из программы wireshark. Если не учесть все блоки то по ним информация может потеряться.
...
Рейтинг: 0 / 0
05.11.2015, 13:50
    #39095283
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
Тут пример 18334280 там весь топик про тот же виалон
...
Рейтинг: 0 / 0
05.11.2015, 13:54
    #39095291
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
roma1975И как это сделать если можно на примере. У меня такой пример. Он не устраивает поскольку учитывает размер одного блока, а нам за раз, может приходить много блоков:

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


Мой исходный пример 18334280 был как раз на любое количество блоков, но ТС добавил break и стало работать только с одним блоком.
...
Рейтинг: 0 / 0
05.11.2015, 14:03
    #39095306
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
Да это был я, сейчас я зарегистрировался и имя это взял. Ну давай я уберу break; Может действительно поможет. Спасибо попробую.
...
Рейтинг: 0 / 0
06.11.2015, 13:06
    #39096511
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
Я сейчас сделал так. Почему -то не всегда отрабатывает строка когда блоки заканчиваются
Код: 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
06.11.2015, 13:08
    #39096515
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
И буду дальше тестировать программу как она ловит данные.
...
Рейтинг: 0 / 0
06.11.2015, 13:16
    #39096538
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
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
06.11.2015, 13:37
    #39096576
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
Так хотелось бы, чтобы программа работала так: считала все блоки данных, которые за раз от ретранслятора поступают мне - это программа делает, когда блоки закончились программа должна выйти
из циклов, но почему -то выход
Код: 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
06.11.2015, 13:50
    #39096595
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
Ну а вообще мне нужно все приходящие данные получать по протоколу wialonretranslator и чтобы программа могла их все принять, не пропускала.
...
Рейтинг: 0 / 0
06.11.2015, 13:56
    #39096604
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
А ну да ты написал, что может оставаться на recv пока что-нибудь не придет или соединение не будет закрыто с другой стороны или порвется. Видать там не закрывается соединение.
...
Рейтинг: 0 / 0
06.11.2015, 14:13
    #39096629
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
roma1975Видать там не закрывается соединение.
А это значит, что могут приходить пакеты данных ещё и ещё. Если ты хочешь принять их все,
без пропусков, тебе надо ждать пока они не придут.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
06.11.2015, 14:22
    #39096638
roma1975
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
Ну вроде она так сейчас и делает, ну посмотрим в реальности как оно будет дальше, просто может получиться так, как я вот сейчас проверял у себя подавая данные на порт и не закрывая соединение, если не происходит закрытие соединения передающей стороной, то последующие данные не принимаются принимающей стороной пока не произойдёт отсоединение передающей стороны. А это плохо неизвестно когда передающая сторона отсоединиться, сколько она всего накопит.
...
Рейтинг: 0 / 0
07.11.2015, 01:16
    #39097119
kolobok0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Размер данных присылаемых по TCP в си.
roma1975,

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

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


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