Я работаю над проектом клиент-сервер и должен реализовать логику, где мне нужно проверить, получил ли я последние данные по соединению сокетов TCP, прежде чем продолжить. Чтобы убедиться, что я получил все данные, я планирую поместить флаг в последний отправленный пакет. У меня было два варианта, как показано ниже, а также связанная с этим проблема.Заполнение данных по TCP
i. Используйте структуру, как показано ниже, и заполните vst_pad для последнего отправленного пакета и проверьте его на стороне recv для его присутствия. Преимущество над вторым вариантом заключается в том, что я не имею, чтобы удалить флаг из фактических данных перед записью на file.Just проверить первый член структуры
typedef struct
{
/* String holding padding for last packet when socket is changed */
char vst_pad[10];
/* Pointer to data being transmitted */
char *vst_data;
//unsigned char vst_data[1];
} st_packetData;
Проблема в том, я должен сериализовать-структуру на каждый отправляемый звонок. Кроме того, я не уверен, получу ли я всю структуру через TCP в одном вызове recv и поэтому должен добавить логику/накладные расходы, чтобы проверять это каждый раз. Я реализовал это до сих пор, но позже понял, что потоковый TCP-протокол не может гарантировать возврат всей структуры в один вызов.
ii. Используйте функцию strncat, чтобы добавить этот флаг в конец к последним отправляемым данным.
Проблема заключается в том, что я должен проверять каждый приемный вызов либо с использованием функций регулярного выражения, либо на функцию strstr для наличия этого флага, и если это необходимо удалить из данных.
Это приложение предназначено для больших объемов передачи данных и поэтому позволяет добавлять минимальные накладные расходы при каждом вызове send/recv/read/write. Было бы очень полезно знать, есть ли лучший вариант, чем предыдущие два или любой другой вариант проверки получения последнего пакета. Программа многопоточная.
Редактировать: Я не знаю общий размер файла, который я собираюсь отправить, но я отправляю фиксированный объем данных. Это fgets читается до тех пор, пока размер не будет указан -1 или пока не встретится новая строка.
Алан: Я не знаю общий размер файла, который я собираюсь отправить, но я отправляю фиксированный объем данных. То есть, fgets читается до указанного размера -1 или до тех пор, пока не встретится новая строка. Я могу использовать strlen в буфере, чтобы узнать фактическую длину данных. – user369823
и, конечно же, вам нужно разобрать эти 4 байта, которые могут быть отправлены в 4 разных вызовах recv. – bew
@Alan: Thnx для ответов до сих пор. Я частично реализовал то, что вы предложили, но я хотел бы знать, как именно я знаю размер, который должен быть помещен в заголовок. Я читаю исправление chuck данных из файла, используя fgets и передавая тот же размер размера. Но как его TCP я точно не знаю размер данных, отправленных до проверки ответа на вызов. Я немного запутался в этом. Псевдокод будет очень полезен ... – user369823