Code:
// fuck creating my own socketerror enum LOL using SocketError = System.Net.Sockets.SocketError;
Code:
// Interface to ws2_32.dll public unsafe partial class Native { public const int SOCKET_ERROR = -1; public const int INVALID_SOCKET = ~0; [DllImport("Ws2_32.dll")] public static extern int WSAStartup(ushort Version, out WSAData Data); [DllImport("Ws2_32.dll")] public static extern SocketError WSAGetLastError(); [DllImport("Ws2_32.dll")] public static extern SOCKET socket(AddressFamily af, SocketType type, ProtocolType protocol); [DllImport("Ws2_32.dll")] public static extern int send(SOCKET s, byte* buf, int len, int flags); [DllImport("Ws2_32.dll")] public static extern int recv(SOCKET s, byte* buf, int len, int flags); [DllImport("Ws2_32.dll")] public static extern SOCKET accept(SOCKET s, void* addr, int addrsize); [DllImport("Ws2_32.dll")] public static extern int listen(SOCKET s, int backlog); [DllImport("Ws2_32.dll", CharSet = CharSet.Ansi)] public static extern uint inet_addr(string cp); [DllImport("Ws2_32.dll")] public static extern ushort htons(ushort hostshort); [DllImport("Ws2_32.dll")] public static extern int connect(SOCKET s, sockaddr_in* addr, int addrsize); [DllImport("Ws2_32.dll")] public static extern int closesocket(SOCKET s); [DllImport("Ws2_32.dll")] public static extern int getpeername(SOCKET s, sockaddr_in* addr, int* addrsize); [DllImport("Ws2_32.dll")] public static extern int bind(SOCKET s, sockaddr_in* addr, int addrsize); [DllImport("Ws2_32.dll")] public static extern int select(int ndfs, fd_set* readfds, fd_set* writefds, fd_set* exceptfds, timeval* timeout); [DllImport("Ws2_32.dll")] public static extern sbyte* inet_ntoa(sockaddr_in.in_addr _in); }
Code:
// Enums from Microsofts website (#defined in C++) public enum AddressFamily : int { Unknown = 0, InterNetworkv4 = 2, Ipx = 4, AppleTalk = 17, NetBios = 17, InterNetworkv6 = 23, Irda = 26, BlueTooth = 32 } public enum SocketType : int { Unknown = 0, Stream = 1, DGram = 2, Raw = 3, Rdm = 4, SeqPacket = 5 } public enum ProtocolType : int { BlueTooth = 3, Tcp = 6, Udp = 17, ReliableMulticast = 113 }
Code:
// Equivilent to C++s "SOCKET" public unsafe struct SOCKET { private void* handle; private SOCKET(int _handle) { handle = (void*)_handle; } public static bool operator ==(SOCKET s, int i) { return ((int)s.handle == i); } public static bool operator !=(SOCKET s, int i) { return ((int)s.handle != i); } public static implicit operator SOCKET(int i) { return new SOCKET(i); } public static implicit operator uint(SOCKET s) { return (uint)s.handle; } public override bool Equals(object obj) { return (obj is SOCKET) ? (((SOCKET)obj).handle == this.handle) : base.Equals(obj); } public override int GetHashCode() { return (int)handle; } }
Code:
// fd_set used in 'select' method public unsafe struct fd_set { public const int FD_SETSIZE = 64; public uint fd_count; public fixed uint fd_array[FD_SETSIZE]; }
Code:
// C# equivilent to C++'s sockaddr_in / SOCKADDR_IN [StructLayout(LayoutKind.Sequential, Size=16)] public struct sockaddr_in { public const int Size = 16; public short sin_family; public ushort sin_port; public struct in_addr { public uint S_addr; public struct _S_un_b { public byte s_b1, s_b2, s_b3, s_b4; } public _S_un_b S_un_b; public struct _S_un_w { public ushort s_w1, s_w2; } public _S_un_w S_un_w; } public in_addr sin_addr; }
Code:
// WSAData structure, used in WSAStarutp [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)] public unsafe struct WSAData { public ushort Version; public ushort HighVersion; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)] public string Description; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)] public string SystemStatus; public ushort MaxSockets; public ushort MaxUdpDg; sbyte* lpVendorInfo; }