You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Rust的Pnet库创建TCP流时SYN包无响应求助

用Pnet库发送TCP SYN包无响应问题求助

我第一次提技术问题,想请大家帮忙。我尝试用Pnet库创建TCP流发送HTTP消息,但发送SYN包后一直收不到响应,不知道问题出在哪。一开始以为是构造的数据包有问题,但复制telnet操作里的SYN包后结果还是一样。试了各种方法都没解决,恳请大家帮忙!

以下是我的代码:

extern crate pnet;
extern crate std;


use core::panic;
use std::io::Error;
use pnet::packet::ipv4::*;
use pnet::packet::ip::IpNextHeaderProtocol;
use pnet::packet::ip::IpNextHeaderProtocols;
use pnet::packet::ipv4::MutableIpv4Packet;
use pnet::packet::*;
use std::net::Ipv4Addr;
use pnet::transport::TransportChannelType::*;
use pnet::transport::TransportProtocol::*;
use pnet::transport::{transport_channel, ipv4_packet_iter};

use pnet::packet::*;
use pnet::packet::tcp::*;
use pnet::packet::tcp::MutableTcpPacket;
use pnet::packet::tcp::TcpOptionNumber;



pub fn create_ipv4_packet<'a>(buffer_ip: &'a mut [u8],ipv4Pac : pnet::packet::ipv4::Ipv4) -> MutableIpv4Packet {

    let mut ipv4_packet = MutableIpv4Packet::new(buffer_ip).unwrap();
    let ipv4_aux = ipv4Pac;

    ipv4_packet.populate(&ipv4_aux);    
    let mut num = 0;
    let mut inmutable = ipv4_packet.to_immutable();
    
    let checks = pnet::packet::ipv4::checksum(&inmutable); 
    num = checks;
    ipv4_packet.set_checksum(checks);
    

    return ipv4_packet;
}

pub fn sendSYN( sourceP : u16, destPort : u16 , ipPacket : MutableIpv4Packet){
        //TCP SYN Packet, obtain with telnet
        let mut tmp: [u8; 40] = [234, 28,0,80,84, 233,15,246,
         0,0,0,0,160,2,250,240,33,122,0,0,2,4,5,180,4,2,8,10,247,
         143,213,137,0,0,0,0,1,3,3,7];

        let tcpPackAux =  MutableTcpPacket::new( &mut tmp);
        let mut tcpPackOpt = tcpPackAux.unwrap();
 
        tcpPackOpt.set_source(sourceP);
        tcpPackOpt.set_destination(destPort);

        let packetTCP = tcpPackOpt.packet();
        let paqueteVecTCP = packetTCP.to_vec();

        let ipPacketCopy = ipPacket;

        let ipv4_TCPPayload = 
        pnet::packet::ipv4::Ipv4{version: ipPacketCopy.get_version(),
            header_length: ipPacketCopy.get_header_length(),
            dscp: ipPacketCopy.get_dscp(),
            ecn: ipPacketCopy.get_ecn(),
            total_length: ipPacketCopy.get_total_length(),
            identification: ipPacketCopy.get_identification(),
            flags: ipPacketCopy.get_flags(),
            fragment_offset: ipPacketCopy.get_fragment_offset(),
            ttl: ipPacketCopy.get_ttl(),
            next_level_protocol: ipPacketCopy.get_next_level_protocol(),
            checksum: ipPacketCopy.get_checksum(),
            source: ipPacketCopy.get_source(),
            destination: ipPacketCopy.get_destination(),
            options: ipPacketCopy.get_options(),
            payload: paqueteVecTCP.clone(), //Payload TCP 
        }; 
        let mut protocol = pnet::transport::TransportChannelType::Layer3(IpNextHeaderProtocols::Tcp);
        

        let (mut px, mut rx) = match transport_channel(4096, protocol) { // Tamaño de 4096 bytes
            Ok((tx, rx)) => (tx, rx),
            Err(e) =>  panic!(),
        };

        let mut int_slice = [0u8; 60]; //60 = TCP + IP 
       
        let mut new_packet = create_ipv4_packet(&mut int_slice, ipv4_TCPPayload );
        let addr = ipPacketCopy.get_destination();

        //We send the IP + TCP packet
        let packetDelivery = match px.send_to(new_packet, std::net::IpAddr::V4(addr)) {
            Ok(n) =>  {
                n;
            },
            Err(e) => {String::from("The packet wasnt sent. An error was detected");}, 
        }; 
}

pub fn main(){

    let sourcePort : u16 = 12345;
    let destPort : u16 = 80;

    let sourceAddress = Ipv4Addr::new(192,168,1,166);
    let destAddress = Ipv4Addr::new(142,251,46,227); 
    let veectt = Vec::new();
    let vectHexaPay = Vec::new();

    let ipPac = pnet::packet::ipv4::Ipv4{version: 4,
        header_length: 5,
        dscp: 0,
        ecn: 1,
        total_length: 60,
        identification: 15,
        flags: 2,
        fragment_offset: 0,
        ttl: 64,
        next_level_protocol: IpNextHeaderProtocol::new(6),
        checksum: 0,
        source: sourceAddress,
        destination: destAddress,
        options: veectt.clone(),
        payload: vectHexaPay.clone(), //Payload TCP 
    }; 

    let mut packetIP =[0u8; 60];

    let mut mutableIpv4Pac = MutableIpv4Packet::new(&mut packetIP).unwrap();
    mutableIpv4Pac.populate(&ipPac); 
    sendSYN(sourcePort, destPort, mutableIpv4Pac);
}

内容的提问来源于stack exchange,提问作者jpft

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 07:54:22