I\'m trying to implement my own transport layer protocol, but I\'m perfectly happy to leave the network layer as-is and not need to mess with the actual IP header information.
Use recvmsg() with the msg[] buffers initialized so that the first one receives the IP header, then the second one will only contain data.
The IP header will always be included when receiving on a SOCK_RAW socket.
Per raw(7):
The IPv4 layer generates an IP header when sending a packet unless the
IP_HDRINCLsocket option is enabled on the socket. When it is enabled, the packet must contain an IP header. For receiving the IP header is always included in the packet.
Reference: