Как посчитать байты с помощью send () в C, включая размер протокола?
Нет надежного способа сделать это из вашей программы.Вы можете вычислить минимальное общее количество байтов, необходимое для передачи данных общего размера полезной нагрузки, которую вы считаете, с учетом нескольких предположений, но вам нужно будет контролировать со стороны ядра, чтобы определить точное количество байтов.
Могу ли я предположить, что при каждом вызове send (), если длина данных меньше 1518 (размер пакета TCP ограничен?), Это всего лишь один пакет TCP, и мне нужно суммировать длину заголовка TCP?
Нет, это не будет безопасным предположением.Основная проблема заключается в том, что ядро не обязательно сопоставляет данные, передаваемые каждым вызовом send()
, с его собственной последовательностью пакетов.Он может объединять данные из нескольких send()
в меньшее количество пакетов.Кроме того, однако, он может использовать либо меньший MTU, либо больший, чем по умолчанию Ethernet, равный 1500 байт, в зависимости от различных факторов, и, кроме того, вам необходимо вписать заголовки пакетов в выбранный MTU, поэтому полезная нагрузка, переносимая одним пакетом, равнаменьше, чем это.
Я подозреваю, что вы делаете это слишком сложно.Если это задача, которая была вам назначена - например, домашнее задание, - то, на мой взгляд, предполагается, что вы рассчитываете только общий размер полезной нагрузки, а не издержки протокола.В качестве альтернативы, если вам необходимо учесть накладные расходы, то я предполагаю, что вы должны оценить , основываясь на измеренных или предполагаемых характеристиках сети.Если вы сами поставили эту проблему, я могу только сказать, что люди обычно делают одно из двух описанных мной вычислений, а не то, о котором вы спрашивали.