The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Передача строк по TCP/IP"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

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

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


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


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

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

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


Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

3. "Передача строк по TCP/IP"  
Сообщение от Heggi email on 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);
    }

//....

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

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

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

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

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

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

6. "Передача строк по TCP/IP"  
Сообщение от jd (??) on 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).

Правка | Высказать мнение | Ответить | Cообщить модератору | Наверх

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру