Я работаю над проектом клиент-сервер и мне нужно реализовать логику, в которой мне нужно проверить, получили ли я последние данные через соединение через сокет TCP, прежде чем продолжить.
Чтобы убедиться, что я получил все данные, я планирую добавить флаг к последнему отправленному пакету. Я имел в виду два варианта, как показано ниже, и также связанную проблему.
я. Используйте структуру, как показано ниже, и заполните vst_pad для последнего отправленного пакета и проверьте его на стороне recv на наличие. Преимущество перед вторым вариантом заключается в том, что мне не нужно удалять флаг из фактических данных перед записью его в файл. Просто проверьте первый член структуры
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 или пока не встретится новая строка.