Проблема отправки нескольких строк одна за другой с использованием сокетов - PullRequest
1 голос
/ 11 марта 2011

Я новичок в программировании сокетов. Необходимо отправить несколько строк одну за другой на сервер и собрать полученную строку.

Теперь проблема в том, что с помощью функции отправки / записи в клиенте все строки читаются за один раз с сервера.

//client.c
sendString(serversocket,"str1"); 

sendString(serversocket,"str2"); 

sendString(serversocket,"str3"); 

//server.c

char *buff=readstring(clientsocket);

printf("%s",buff) ;//output : str1str2str2

Нужно получить str1, str2 и str3 ...

Мне нужно сделать так, чтобы получать один за другим. Как я могу это сделать? Любая помощь будет оценена.

Ответы [ 3 ]

3 голосов
/ 11 марта 2011

TCP-сокет представляет собой поток байтов - вам придется разделить данные на принимающей стороне.

Для строк вы можете сделать это, например, один из этих двух способов:

Клиент:

  • отправить целую длину
  • отправить строку данных

Сервер:

  • читать целую длину
  • прочитать это количество байтов в строку

Или вы можете использовать 0-терминацию:

Клиент:

  • отправить строку с последующим байтом 0

Сервер:

  • Прочитать как можно больше, отсканировать 0 байт, извлечь строку

Вам придется обработать оба эти случая на стороне сервера:

  • Сервер получает 1 байт за каждый вызов recv()
  • Сервер получает все данные за один вызов recv()
0 голосов
/ 11 марта 2011

Поскольку TCP является потоком байтов, вам необходимо разделять ваши фрагменты данных, т.е. ваши логические пакеты.В этом случае символ новой строки '\ n' может быть наиболее очевидным выбором, или вы можете использовать нулевой символ, '\ 0'.

//client.c
sendString(serversocket,"str1\n"); 

sendString(serversocket,"str2\n"); 

sendString(serversocket,"str3\n"); 

Затем вы можете использовать что-то вроде strtok для разбиения входных данных на составляющие логические пакеты.

0 голосов
/ 11 марта 2011

Я предполагаю, что вы используете TCP здесь.В этом случае все, что отправлено в сокет, рассматривается как поток.Таким образом, вам придется добавить разделители в поток, чтобы разделить строки.Вы можете отправить новую строку после каждой строки, а затем проанализировать ввод, чтобы снова разбить строки.

...