Добрый день! 
Есть проблема - хочу с помощью raw socket отправлять TCP/IP пакет. То есть у меня есть ГОТОВЫЙ буфер с байтами в котором все TCP/IP зоголовки и пр пр.
Исходники:
void send_ip(void* data, u16_t len) {
std::cout << "begine  of send_ip" << std::endl;
int s;
struct sockaddr_in dst_addr;
if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) {
  perror("error:");
 exit(EXIT_FAILURE);
}
const int hdrincl = 1;
setsockopt(s, IPPROTO_IP, IP_HDRINCL, &hdrincl, sizeof(hdrincl));
dst_addr.sin_family = AF_INET;
dst_addr.sin_port = 6667;
inet_aton("172.17.9.71", &dst_addr.sin_addr);
std::cout << "before send in  send_ip, len = " << (u16_t)len << std::endl;
if (sendto(s, data, len, 0,
  (struct sockaddr *)&dst_addr, (socklen_t)sizeof(dst_addr)) < 0) {
perror("sendto ERROR :");
    }
    else{
  }
} 
 
Выхлоп в консоль:
sendto ERROR :: Invalid argument 
Меняем 
     s = socket(AF_INET, SOCK_RAW, IPPROTO_TCP) 
И коментим 
setsockopt(s, IPPROTO_IP, IP_HDRINCL, &hdrincl, sizeof(hdrincl));
Отсылка проходит нормально, НО 
в Wireshark я вижу 
110539  1059.796163000  172.17.9.210    172.17.9.71 TCP 78  65535 > 65535 [SYN, RST,     
Reserved] Seq=0 Win=1, bogus TCP header length (0, must be at least 20) 
Соответственно, сообщение до сервера не доходит . Что я делаю не так?