функция winsock - PullRequest
       27

функция winsock

1 голос
/ 28 сентября 2010

У меня есть общий вопрос о функции recv в winsock.Я пишу программу с архитектурой клиент / сервер, в которой клиент отправляет изображение с камеры на сервер, а сервер отправляет другое изображение обратно клиенту.Клиент отправляет несколько изображений, пока программа не будет закрыта.И сервер будет отвечать на каждое полученное изображение другим изображением.

Клиент (отправка) ----> Сервер (получение) ----> Сервер (отправка) ----> Клиент (получение),^ _ __ _ __ _ __ _ ____ LOOP _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ __ _ _ |

Моя проблема в том, что сервер получает функцию.Если я вызову функцию приема несколько раз с большим буфером в 512 байт, как я узнаю, что получил все изображение?Примеры, которые я нашел, просто ждут, пока соединение не закроется (recv возвращает 0), но я хочу получить несколько изображений, не закрывая соединение.Но если я получу до тех пор, пока в буфере не останется ни одного байта, функция recv остановит поток, пока не появятся новые байты (но этого никогда не произойдет, потому что сервер сначала хочет отправить собственное изображение обратно клиенту до полученияследующий).

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

Ответы [ 2 ]

4 голосов
/ 28 сентября 2010

Разработка протокола с заголовком , который включает в себя размер n объема данных, который должен ожидать получатель. Получатель считывает только заголовок PLUS n байтов (указанный заголовком) из TCP-потока. Тогда вы можете ожидать следующего заголовка. Если вы не получите эти n байтов, передача не завершена.

Короче говоря, вы можете определить сообщение в протоколе следующим образом:

Сообщение:

  • длина данных (32 бита, без знака int)
  • содержание данных
1 голос
/ 28 сентября 2010

оберните данные вашего изображения в пакет, состоящий из

  • заголовок фиксированного размера, сообщающий, сколько байтов последует
  • фактические данные изображения

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

пример кода без проверки ошибок; Кроме того, вы всегда должны зацикливать реальный вызов recv, поскольку данные могут поступать кусками!

unsigned bytesExpected;
Image imgData;
while( !LoopMustStop )
{
  Read( sizeof( unsigned ), bytesExpected );
  Read( bytesExpected, imgData );
  Process( bytesExpected, imgData )
}
...