Не вдавался в подробности, но не увидел вызова
BOOL flag = TRUE;
setsockopt(my_sock, IP_PROTOIP, IP_HDRINCL, (char *)&flag, sizeof(flag));
Эта опция разрешает возвращать данные с заголовком. Сделай вызов перед тем как
вызвать bind() или recv() — должна помочь.
Алексей