Я новичок в C, и я пытаюсь создать дейтаграмму UDP, а затем отправлять ее из клиентской программы в серверную программу на другой машине.Создание дейтаграммы UDP с заголовком фиксированного размера в C
У меня возникла проблема при попытке создать дейтаграмму, в частности заголовок фиксированного размера (IPv4): Формат заголовка (клиентский IP (32-разрядный) | клиентский порт (16 бит) | длина пакета (32 бит) | ... и т. Д.)
Подход, по которому я решил пойти, состоял в том, чтобы собрать необходимую информацию заголовка и тела, а затем передать их в char*
и затем объединить их вместе для создания дейтаграммы. Тем не менее, когда я набрал int
и по номеру char*
(номер порта и длина пакета), он не гарантирует фиксированный размер char*
(например, если длина пакета (длинный тип данных) вычисляется как 440, и я конвертирую его в char*
, тогда strlen покажет длину char*
как 2 вместо 4, так как число не достаточно велико, чтобы взять все 4 байта, я бы предположил ...)
Я пробовал использовать другой способ преобразования длинного символа фиксированного размера * по побитового операции:
//assume the datagram size was calculated to be 440 bits
unsigned long len = 440;
unsigned char dg_len [4];
dg_len[0] = (len >> 24) & 0xFF;
dg_len[1] = (len >> 16) & 0xFF;
dg_len[2] = (len >> 8) & 0xFF;
dg_len[3] = len & 0xFF;
printf("%d" ,strlen(dg_lenPtr)); //this would display 0
printf("%d" ,(unsigned long)dg_lenPtr); //this display some random number
Единственное объяснение, которое я думал для этого является то, что неиспользованного 2 высших б ytes из dg_lenPtr считываются как нулевой символ, поскольку strlen показывает длину, равную 0.
Я начинаю думать, что char*
не является структурой данных, которую мне нужно использовать для создания дейтаграммы. Может ли кто-нибудь указать мне в правильном направлении на то, что мне нужно сделать, чтобы построить заголовок размера исправления для дейтаграммы?
'strlen' предназначен для * строк *, а не произвольных данных. –
Я также думаю, что char * не является структурой данных, используемой для создания дейтаграммы. Есть ли лучший тип данных, который я могу использовать для достижения того, что я пытаюсь сделать? –
Вам нужно будет решить проблемы с порядком байтового байта сети (big-endian) по сравнению с машинным байтом (малоприводным, если вы используете Intel). Вы можете использовать такие примитивы, как ['htons()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/htons.html) и 'htonl()' для кодирования 2-байтных и 4-байтовых значений в сетевом порядке байтов, а затем 'memmove()' или 'memcpy()' значения в ваш буфер заголовка (который, вероятно, лучше всего определяется как массив 'unsigned char'). –