я может глупость скажу, но...
memset(datagram, 0, sizeof(datagram));
после этого с datagram ничего не произошло кроме как:
sendto(s, datagram, sizeof(datagram), 0, (SOCKADDR *)&sin, sizeof(sin)
соответственно оно отправляет все пустое(забитое нулями)
или я чего-то не понял...