Добрый день!
Есть проблема - хочу с помощью 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)
Соответственно, сообщение до сервера не доходит . Что я делаю не так?