recv
не может изменить свой первый аргумент, поскольку он берется по значению.
Вы не показываете, где вы объявили msg
или i
, но на основе этой строки
printf("S: msg says %s\n", msg->_payload);
Где вы используете оператор ->
на msg
, я предполагаю, что это, вероятно, так:
struct somestruct* msg = malloc(sizeof(struct somestruct));
int i;
Тогда вы делаете это:
num_bytes = recv(i, &msg, MAX_MSG_BYTE, 0);
Обратите внимание, что msg
является уже указателем, поэтому &msg
является указателем на указатель .
Затем он получит данные и попытается сохранить их там, где находится указатель msg
, а не в том месте, которое msg
указывает на . Обычно указатели имеют длину всего 4 байта, поэтому это приведет к переполнению хранилища, если вы получите более четырех байтов. Если i
объявлено в стеке после msg
, то вполне вероятно, что оно перезаписывается этим переполнением, и происходит перезапись всех нулевых байтов из полученного пакета.
Поскольку msg
уже является указателем, измените строку приема, чтобы устранить лишнюю косвенность:
num_bytes = recv(i, msg, MAX_MSG_BYTE, 0);
Аналогичным образом, вы можете рассмотреть возможность внесения того же изменения в строку
handle_request(arg, &msg)
, если функция handle_request
действительно не ожидает указателя на указатель.