Hi,

I got an exception when doing socket.IOControl(SIO_RCVALL, IN, OUT) with Mono 
on Linux,
It works well on Windows platform,
It seems int SIO_RCVALL = unchecked((int)0x98000001) is not in Linux ioctl_list,
How can I fix the code below to work on Linux?
Thanks.

//This file contains the RawSocket class.  The goal of this class is
to have a generic packet
//sniffing kind of class that fires events when an incoming IP packet
is received.  The event
//gives the user access to everything contained in the IP packet and
hopefully makes creating
//your own packet sniffer quite easy.  The event args returned with
the event give the user of
//the class access to things like the from and to IP address, ports,
protocol, etc. and even the
//contents of the message in the form of a byte array.


namespace ReceiveAll
{
        using System;
        using System.Net;
        using System.Net.Sockets;
        using System.Runtime.InteropServices;

        
        [StructLayout(LayoutKind.Explicit)]
        public struct IPHeader
        {
                [FieldOffset(0)] public byte    ip_verlen; //IP version and IP
Header length Combined
                [FieldOffset(1)] public byte    ip_tos; //Type of Service
                [FieldOffset(2)] public ushort  ip_totallength; //Total Packet 
Length
                [FieldOffset(4)] public ushort  ip_id; //Unique ID
                [FieldOffset(6)] public ushort  ip_offset; //Flags and Offset
                [FieldOffset(8)] public byte    ip_ttl; //Time To Live
                [FieldOffset(9)] public byte    ip_protocol; //Protocol (TCP, 
UDP,
ICMP, Etc.)
                [FieldOffset(10)] public ushort ip_checksum; //IP Header 
Checksum
                [FieldOffset(12)] public uint   ip_srcaddr; //Source IP Address
                [FieldOffset(16)] public uint   ip_destaddr; //Destination IP 
Address
        }

        public class RawSocket
        {
                private bool error_occurred;
                public bool KeepRunning;
                private static int len_receive_buf;
                byte [] receive_buf_bytes;
                private Socket socket = null; 

                public RawSocket()
                {
                        error_occurred=false;
                        len_receive_buf = 4096;
                        receive_buf_bytes = new byte[len_receive_buf];
                }
                
                public void CreateAndBindSocket(string IP)
                {
                        socket = new Socket(AddressFamily.InterNetwork, 
SocketType.Raw,
ProtocolType.IP);
                        socket.Blocking = false;
                        socket.Bind(new IPEndPoint(IPAddress.Parse(IP), 0));

                        if (SetSocketOption()==false) error_occurred=true;
                }

                public void Shutdown()
                {
                        if(socket != null)
                        {
                                socket.Shutdown(SocketShutdown.Both);
                                socket.Close();
                        }
                }

                private bool SetSocketOption()
                {
                        bool ret_value = true;
                        try
                        {
                                socket.SetSocketOption(SocketOptionLevel.IP,
SocketOptionName.HeaderIncluded, 1);
    
                                byte []IN = new byte[4]{1, 0, 0, 0};
                                byte []OUT = new byte[4];
                                int SIO_RCVALL = unchecked((int)0x98000001);
                                int ret_code = socket.IOControl(SIO_RCVALL, IN, 
OUT);
                                ret_code = OUT[0] + OUT[1] + OUT[2] + OUT[3];
                                if(ret_code != 0) ret_value = false;
                        }
                        catch(SocketException)
                        {
                                ret_value = false;
                        }
                        return ret_value;
                }

                public bool ErrorOccurred
                {
                        get
                        {
                                return error_occurred;
                        }
                }

                unsafe private void Receive(byte [] buf, int len)
                {
                        byte temp_protocol=0;
                        uint temp_version=0;
                        uint temp_ip_srcaddr=0;
                        uint temp_ip_destaddr=0;
                        short temp_srcport=0;
                        short temp_dstport=0;
            IPAddress temp_ip;
                        
                        PacketArrivedEventArgs e=new PacketArrivedEventArgs();

                        fixed(byte *fixed_buf = buf)
                        {
                                IPHeader * head = (IPHeader *) fixed_buf;
                                e.HeaderLength=(uint)(head->ip_verlen & 0x0F) 
<< 2;
                                
                                temp_protocol = head->ip_protocol;
                                switch(temp_protocol)
                                {
                                        case 1: e.Protocol="ICMP:";     break;
                                        case 2: e.Protocol="IGMP:";     break;
                                        case 6: e.Protocol="TCP:";      break;
                                        case 17: e.Protocol="UDP:";     break;
                                    default: e.Protocol= "UNKNOWN"; break;
                                }

                                temp_version =(uint)(head->ip_verlen & 0xF0) >> 
4;
                                e.IPVersion = temp_version.ToString();

                temp_ip_srcaddr = head->ip_srcaddr;
                                temp_ip_destaddr = head->ip_destaddr;
                                temp_ip = new IPAddress(temp_ip_srcaddr);
                                e.OriginationAddress =temp_ip.ToString();
                                temp_ip = new IPAddress(temp_ip_destaddr);
                                e.DestinationAddress = temp_ip.ToString();

                                temp_srcport = *(short 
*)&fixed_buf[e.HeaderLength];
                                temp_dstport = *(short 
*)&fixed_buf[e.HeaderLength+2];
                        
e.OriginationPort=IPAddress.NetworkToHostOrder(temp_srcport).ToString();
                        
e.DestinationPort=IPAddress.NetworkToHostOrder(temp_dstport).ToString();

                                e.PacketLength =(uint)len;
                                e.MessageLength =(uint)len - e.HeaderLength;

                                e.ReceiveBuffer=buf;
                                
Array.Copy(buf,0,e.IPHeaderBuffer,0,(int)e.HeaderLength);
                        
Array.Copy(buf,(int)e.HeaderLength,e.MessageBuffer,0,(int)e.MessageLength);
                        }
                        
                        OnPacketArrival(e);
                }
  
                public void Run() 
                {
                        IAsyncResult ar = 
socket.BeginReceive(receive_buf_bytes, 0,
len_receive_buf, SocketFlags.None, new AsyncCallback(CallReceive), this);
                }

                private void CallReceive(IAsyncResult ar)
                {
                        try
                        {
                                int received_bytes;
                                received_bytes = socket.EndReceive(ar); 
                                Receive(receive_buf_bytes, received_bytes);
                        }
                        catch {} //ignore all network errors ;)
                        if (KeepRunning) Run();
                }

                public class PacketArrivedEventArgs : EventArgs 
                {
                        public PacketArrivedEventArgs() 
                        {
                                this.protocol = "";
                                this.destination_port  = "";
                                this.origination_port  = "";
                                this.destination_address  = "";
                                this.origination_address  = "";
                                this.ip_version  = "";

                                this.total_packet_length =0;
                                this.message_length =0;
                                this.header_length =0;

                                this.receive_buf_bytes=new 
byte[len_receive_buf];
                                this.ip_header_bytes=new byte[len_receive_buf];
                                this.message_bytes=new byte[len_receive_buf];
                        }

                        public string Protocol
                        {
                                get {return protocol;}
                                set {protocol=value;}
                        }
                        public string DestinationPort
                        {
                                get {return destination_port;}
                                set {destination_port=value;}
                        }
                        public string OriginationPort
                        {
                                get {return origination_port;}
                                set {origination_port=value;}
                        }
                        public string DestinationAddress
                        {
                                get {return destination_address;}
                                set {destination_address=value;}
                        }
                        public string OriginationAddress
                        {
                                get {return origination_address;}
                                set {origination_address=value;}
                        }
                        public string IPVersion
                        {
                                get {return ip_version;}
                                set {ip_version=value;}
                        }
                        public uint PacketLength
                        {
                                get {return total_packet_length;}
                                set {total_packet_length=value;}
                        }
                        public uint MessageLength
                        {
                                get {return message_length;}
                                set {message_length=value;}
                        }
                        public uint HeaderLength
                        {
                                get {return header_length;}
                                set {header_length=value;}
                        }
                        public byte [] ReceiveBuffer
                        {
                                get {return receive_buf_bytes;}
                                set {receive_buf_bytes=value;}
                        }
                        public byte [] IPHeaderBuffer
                        {
                                get {return ip_header_bytes;}
                                set {ip_header_bytes=value;}
                        }
                        public byte [] MessageBuffer
                        {
                                get {return message_bytes;}
                                set {message_bytes=value;}
                        }
                        private string protocol;
                        private string destination_port;
                        private string origination_port;
                        private string destination_address;
                        private string origination_address;
                        private string ip_version;
                        private uint total_packet_length;
                        private uint message_length;
                        private uint header_length;
                        private byte []receive_buf_bytes = null;
                        private byte []ip_header_bytes = null;
                        private byte []message_bytes = null;
                }

                public delegate void PacketArrivedEventHandler(
                        Object sender, PacketArrivedEventArgs args);

                public event PacketArrivedEventHandler PacketArrival;

                protected virtual void OnPacketArrival(PacketArrivedEventArgs 
e) 
                {
                        if (PacketArrival != null) 
                        {
                                PacketArrival(this, e);
                        }
                }
        }
}
 
Robin Wang
_______________________________________________
Mono-devel-list mailing list
Mono-devel-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-devel-list

Reply via email to