Не используйте strcpy()
, чтобы поместить двоичную структуру в двоичный массив. Аналогично, не используйте strlen()
, чтобы получить длину структуры. Обе функции предназначены для строк и будут копировать / читать байты, пока они не встретят нулевой байт. Используйте memcpy()
и sizeof()
вместо:
memcpy(send_data, &init, sizeof(init));
sendto(sock, send_data, sizeof(init), 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
В этом случае просто избавьтесь от массива и передайте структуру непосредственно sendto()
:
sendto(sock, (char*)&init, sizeof(init), 0, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));
Теперь, с учетом сказанного, есть проблема с router_id. Большинство сетевых протоколов требуют упорядочения сетевых байтов, поэтому вам может понадобиться или не потребоваться htonl()
, в зависимости от того, что на самом деле ожидает эмулятор:
init.router_id = htonl(router_id);