Прежде всего: даже если бы ваше время было синхронизировано, вы бы рассчитывали задержку, а не пропускную способность. В каждом сетевом соединении есть вероятность, что в данный момент времени существует более одного пакета в пути, что делает ваш подход с одним пакетом бесполезным для измерения пропускной способности.
например. Сравните время пинга с вашего мобильного телефона на HTTP-сервер с максимальной скоростью загрузки - время пинга будет десятки мс, размер пакета будет около. 1,5 КБайт, что приведет к гораздо более низкой максимальной пропускной способности, чем наблюдаемый при загрузке.
Если вы хотите измерить реальную пропускную способность, используйте блокирующий сокет на стороне отправителя и отправьте, например, 1 миллион пакетов настолько быстро, насколько позволяет система, на принимающей стороне измерьте время между прибытием первого пакета и прибытием последнего пакета.
Если OTOH вы хотите точно измерить задержку, используйте
struct packet{
long sent_time;
long reflect_time;
char* data;
}
и сервер должен отражать пакет. На стороне клиента проверьте все три метки времени, а затем поменяйте ролями, чтобы справиться с асимметричными задержками.
Редактировать: Я имел в виду: время отражения будет "другими" часами, поэтому при запуске теста вперед-назад вы сможете отфильтровать смещение.