URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5291
[ Назад ]

Исходное сообщение
"Передача строк по TCP/IP"

Отправлено Heggi , 29-Мрт-06 13:53 
Объясните новичку.
Требуется передавать множество строк вида "data1 \t data2 \t ... dataN \n"
Передачу осуществляю стандартно через send(sock, tstr, strlen(tstr), 0);
При этом посылается подряд несколько строк (циклом)
Прием осуществляю так: i=recv(sock, buf, BUFSZ, 0);
Что я буду получать с каждым recv ?? одну строку? или все строки друг за другом, пока не заполнится buf ??

Как разделить полученный поток построчно?


Содержание

Сообщения в этом обсуждении
"Передача строк по TCP/IP"
Отправлено Hordi , 29-Мрт-06 17:38 
Получите как получится :) Может все сразу, а может и побайтно.



"Передача строк по TCP/IP"
Отправлено Heggi , 29-Мрт-06 23:49 
>Получите как получится :) Может все сразу, а может и побайтно.

А как это "что получится" построчно-то разобрать ?
никогда не работал с подобным "нипонять что" и даже не представляю, как такое сделать...



"Передача строк по TCP/IP"
Отправлено Heggi , 30-Мрт-06 01:49 
Попробовал и сделал так. Если есть замечания и все такое...

#define BUFSZ 1024;
//....
char buf[1];
char dbuf[BUFSZ];
//....

while(1)
    {
    // Принимаем соединение
        if((c = accept(s, cp, &sz)) == -1)
    {
        perror("Ошибка при выполнении accept");
        exit(1);
        }
    // Принимаем данные
    bzero((char *)&dbuf[0],BUFSZ);
    while((recv(c, (char *)&buf[0], 1, 0)) > 0)
    {
        if (buf[0]!='\n')
        strncat((char *)&dbuf[0],(char *)&buf[0],1);
        else
        {
        if (strncmp((char *)&dbuf[0],"ENDOFDATA",9)==0)
            break;
        //Обработаем полученную строчку    
        //....
        bzero((char *)&dbuf[0],BUFSZ);
        }
    }
    // Закрываем соединение
    close(c);
    }

//....


"Передача строк по TCP/IP"
Отправлено Hordi , 30-Мрт-06 10:41 
Если объяснять в 2-х словах, то в простейшем случае для пересылки чего-либо формируешь блок из двух полей - размер данных

"Передача строк по TCP/IP"
Отправлено Hordi , 30-Мрт-06 10:44 
Если объяснять в 2-х словах, то в простейшем случае для пересылки чего-либо формируешь блок из двух полей - размер данных и данные
uint|data...

При приеме ожидаешь первые 4 байта - размер приходящих данных, далее ожидаешь пока придут все данные полученного размера.

Ну, а дальше все зависит от вашей фантазии...


"Передача строк по TCP/IP"
Отправлено jd , 30-Мрт-06 17:44 
Не обижайтесь, но вам нужно серьёзно поработать над языком (в смысле, над C). То, что вы привели, просто трудно читать.
char buf[1]; - это зачем? почему не char b;?
(char *)&dbuf[0] - это вообще нонсенс. нужно написать просто dbuf.
И ';' после определения макроса не ставится...
То есть это всё конечно корректно с точки зрения языка, но никак не с точки зрения здравого смысла.
Так же, делать bzero в конце каждой итерации цикла... в этом нет никакого смысла.

Что касается вашего случая, то можно попробовать что-нибудь вроде:
#define BUFSZ 1024
//....
char dbuf[BUFSZ];
FILE* f;
//....

while(1)
{
  // Принимаем соединение
  if((c = accept(s, cp, &sz)) == -1)
  {
     perror("Ошибка при выполнении accept");
     exit(1);
  }
  f = fdopen(c, "w+");
  if(!f)
  { perror(...);
    exit(1);
  }
  // Принимаем данные
  while(fgets(dbuf, BUFSZ, f))
  {
    if (strncmp(dbuf,"ENDOFDATA",9)==0)
      break;
    //Обработаем полученную строчку
    //....
  }
  // Закрываем соединение
  shutdown(...);
  fclose(f);
}

//....

Вроде это должно работать. Если же необходимо использовать recv(2) с какими-то параметрами НЕ по-умолчанию, то можно написать свой аналог fgets(3).