Ошибка в этом коде:
send(sock, message.length + message.send_data, sizeof(message), 0)
Прототип для отправки:
ssize_t send(int s, const void *buf, size_t len, int flags);
Обратите внимание, что параметр 2 является указателем.
В вашем коде вы указали его как длину (введите uint32_t), добавленную в буфер (введите char *).
Это добавление приведет к символу *, (указателю на символ), но к указателю на непредсказуемую и бессмысленную область памяти.
Чтобы получить указатель на буфер, вы хотите:
send(sock, &message, sizeof(message), 0)
Обратите внимание, что получение адреса структуры не переносимо или не всегда желательно из-за проблем с заполнением. Но на типичной 32-битной архитектуре это должно подойти.
Это отправит данные, начиная со структуры сообщения, но отправив 4100 (4096 + 4) байтов !.
Я не думаю, что вы собираетесь отправить так много. Третий параметр говорит, сколько байтов для отправки, и должен быть установлен в:
sizeof(uint32_t) + strlen(data); // 4-byte Integer + Length of the data "<MOP><test/></MOP>"
Обратите внимание, что не включает в себя Null-Terminator для данных, но ваш начальный цикл for также не копировал Null-Terminator
(Если вы хотите использовать нулевой терминатор, сделайте ваш начальный цикл for равным strlen (data) + 1 и используйте strlen (data) + 1 в других местах а также).
В идеале, вы должны кэшировать strlen (данные) в локальную переменную, а не вызывать ее так часто. (вы также неоднократно вызываете strlen в начальном цикле for).
Ваше окончательное утверждение будет выглядеть так:
if(send(sock, &message, sizeof(uint32_t)+strlen(data), 0) == -1){
printf("\nSocket error.");
exit(1);
}
Попробуйте, и дайте мне знать, как это происходит.