C-сокеты - случайное получение более одной строки за раз - PullRequest
2 голосов
/ 11 декабря 2010

Я столкнулся с интересной проблемой C-сокетов.

Я получаю входящие строки и заметил, что случайно получу 3 строки одновременно для первых 2 ~ 4 строк.

Например, я получаю следующие входящие строки.

1~message~i love you\r\n
2~message~do you love me?\r\n
3~message~when are we going to meet again?\r\n 
4~message~How about now?\r\n
5~message~Oh! I'm pregnant!\r\n

Я добавил счетчик для отслеживания количества полученных сообщений и заметил, что счетчик иногда не считает первые 3 строки. Например

1~message~i love you\r\n
->Line 1 received
2~message~do you love me?\r\n
3~message~when are we going to meet again?\r\n
4~message~How about now?\r\n
->Line 2 received
5~message~Oh! I'm pregnant!\r\n
->Line 3 received

Ниже приведен мой код для печати номера строки

int lineNo = 1;
while ((recvBytes = recv(clntSockfd, buffer, sizeof(buffer), 0)) > 0) {
    printf("%s", buffer);
    memset(&buffer, 0, sizeof(buffer));
    printf("Line %d received\n", lineNo++);
}

Я не уверен, почему это происходит, поскольку эта проблема не появилась, когда я кодировал в Java nio.

Есть идеи, ребята?

Ответы [ 3 ]

8 голосов
/ 11 декабря 2010

Предполагая, что вы используете TCP, связывание вызовов recv () с «сообщениями» (или «строками») в вашем случае некорректно.TCP, по сути, представляет собой поток байтов.Отправляющая операционная система может свободно группировать несколько вызовов send () в один IP-пакет, а принимающая операционная система может сообщать о нескольких входящих пакетах как один вызов recv () (при условии, что буфер достаточно большой).Он может даже решить разделить входящий пакет между вызовами recv.

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

То, что этого не произошло в Java, было чистой удачей.

1 голос
/ 11 декабря 2010

Вы не читаете до конца строки.buffer может содержать более одной строки .

0 голосов
/ 11 декабря 2010

какой тип подключения вы используете?

UDP в большинстве случаев ненадежен.

TCP намного лучше, чем UDP, с точки зрения надежности.

...