Struct cross_socket::packet::tcp::TcpPacket
source · pub struct TcpPacket {
pub source: u16,
pub destination: u16,
pub sequence: u32,
pub acknowledgement: u32,
pub data_offset: u8,
pub reserved: u8,
pub flags: Vec<TcpFlag>,
pub window: u16,
pub checksum: u16,
pub urgent_ptr: u16,
pub options: Vec<TcpOption>,
pub payload: Vec<u8>,
}
Expand description
Represents a TCP packet.
Fields§
§source: u16
§destination: u16
§sequence: u32
§acknowledgement: u32
§data_offset: u8
§reserved: u8
§flags: Vec<TcpFlag>
§window: u16
§checksum: u16
§urgent_ptr: u16
§options: Vec<TcpOption>
§payload: Vec<u8>
Implementations§
source§impl TcpPacket
impl TcpPacket
sourcepub fn from_bytes(packet: &[u8]) -> TcpPacket
pub fn from_bytes(packet: &[u8]) -> TcpPacket
Examples found in repository?
examples/datalink_socket/tcp_ping.rs (line 49)
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
fn main() {
let interface: Interface = cross_socket::interface::get_default_interface().unwrap();
// Create new socket
let mut socket: DataLinkSocket = DataLinkSocket::new(interface, false).unwrap();
// Create packet info
let mut packet_info = PacketInfo::new();
packet_info.src_mac = socket.interface.mac_addr.clone().unwrap();
packet_info.dst_mac = socket.interface.gateway.clone().unwrap().mac_addr;
packet_info.ether_type = EtherType::Ipv4;
packet_info.src_ip = IpAddr::V4(socket.interface.ipv4[0].addr);
packet_info.dst_ip = IpAddr::V4(std::net::Ipv4Addr::new(1, 1, 1, 1));
packet_info.src_port = Some(53443);
packet_info.dst_port = Some(80);
packet_info.ip_protocol = Some(IpNextLevelProtocol::Tcp);
packet_info.payload = vec![0; 0];
// Send TCP SYN packets to 1.1.1.1:80
match socket.send(packet_info) {
Ok(packet_len) => {
println!("Sent {} bytes", packet_len);
}
Err(e) => {
println!("Error: {}", e);
}
}
// Receive packets
println!("Waiting for TCP SYN+ACK... ");
loop {
match socket.receive() {
Ok(packet) => {
let ethernet_packet = cross_socket::packet::ethernet::EthernetPacket::from_bytes(&packet);
if ethernet_packet.ethertype != EtherType::Ipv4 {
continue;
}
let ip_packet = cross_socket::packet::ipv4::Ipv4Packet::from_bytes(ðernet_packet.payload);
if ip_packet.next_level_protocol != IpNextLevelProtocol::Tcp || ip_packet.source != std::net::Ipv4Addr::new(1, 1, 1, 1) {
continue;
}
println!("Received {} bytes from {}", packet.len(), ip_packet.source);
let tcp_packet = cross_socket::packet::tcp::TcpPacket::from_bytes(&ip_packet.payload);
println!("Packet: {:?}", tcp_packet);
break;
}
Err(e) => {
println!("Error: {}", e);
}
}
}
}
More examples
examples/socket/tcp.rs (line 69)
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
fn main() {
let interface: Interface = cross_socket::interface::get_default_interface().unwrap();
let src_ip: IpAddr = IpAddr::V4(interface.ipv4[0].addr);
let src_socket_addr: SocketAddr = SocketAddr::new(src_ip, 53443);
let dst_ip: IpAddr = IpAddr::V4(Ipv4Addr::new(1, 1, 1, 1));
let dst_socket_addr: SocketAddr = SocketAddr::new(dst_ip, 80);
let socket_option = SocketOption {
ip_version: IpVersion::V4,
socket_type: SocketType::Raw,
protocol: Some(IpNextLevelProtocol::Tcp),
timeout: None,
ttl: None,
non_blocking: false,
};
// Sender socket
let socket: Socket = Socket::new(socket_option).unwrap();
// Receiver socket
// RAW SOCKET recvfrom not working for TCP. So we use DataLinkSocket instead.
let mut listener_socket: DataLinkSocket = DataLinkSocket::new(interface, false).unwrap();
// Create packet info
let mut packet_info = PacketInfo::new();
packet_info.src_ip = src_socket_addr.ip();
packet_info.dst_ip = dst_socket_addr.ip();
packet_info.src_port = Some(src_socket_addr.port());
packet_info.dst_port = Some(dst_socket_addr.port());
packet_info.ip_protocol = Some(IpNextLevelProtocol::Tcp);
packet_info.payload = vec![0; 0];
// Build TCP SYN packet
let tcp_packet = cross_socket::packet::builder::build_tcp_syn_packet(packet_info);
// Send TCP SYN packet to 1.1.1.1
match socket.send_to(&tcp_packet, dst_socket_addr) {
Ok(packet_len) => {
println!("Sent {} bytes", packet_len);
}
Err(e) => {
println!("Error: {}", e);
}
}
// Receive packets
println!("Waiting for TCP SYN+ACK... ");
loop {
match listener_socket.receive() {
Ok(packet) => {
let ethernet_packet = cross_socket::packet::ethernet::EthernetPacket::from_bytes(&packet);
if ethernet_packet.ethertype != EtherType::Ipv4 {
continue;
}
let ip_packet = cross_socket::packet::ipv4::Ipv4Packet::from_bytes(ðernet_packet.payload);
if ip_packet.next_level_protocol != IpNextLevelProtocol::Tcp || ip_packet.source != std::net::Ipv4Addr::new(1, 1, 1, 1) {
continue;
}
println!("Received {} bytes from {}", packet.len(), ip_packet.source);
let tcp_packet = cross_socket::packet::tcp::TcpPacket::from_bytes(&ip_packet.payload);
println!("Packet: {:?}", tcp_packet);
break;
}
Err(e) => {
println!("Error: {}", e);
}
}
}
}
Trait Implementations§
source§impl PartialEq<TcpPacket> for TcpPacket
impl PartialEq<TcpPacket> for TcpPacket
impl StructuralPartialEq for TcpPacket
Auto Trait Implementations§
impl RefUnwindSafe for TcpPacket
impl Send for TcpPacket
impl Sync for TcpPacket
impl Unpin for TcpPacket
impl UnwindSafe for TcpPacket
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more