Guest User

Untitled

a guest
Aug 14th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.68 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Runtime.InteropServices;
  6. using System.Net.Sockets;
  7.  
  8. namespace KiDS_Projekat
  9. {
  10.  
  11.  
  12.     public class Program
  13.     {
  14.         static void Main(string[] args)
  15.         {
  16.             Native native = new Native();
  17.        
  18.  
  19.             native.Listen(8080);
  20.        
  21.             Console.ReadLine();
  22.  
  23.         }
  24.     }
  25.  
  26.     // Enums from Microsofts website (#defined in C++)
  27.     public enum AddressFamily : int
  28.     {
  29.         Unknown = 0,
  30.         InterNetworkv4 = 2,
  31.         Ipx = 4,
  32.         AppleTalk = 17,
  33.         NetBios = 17,
  34.         InterNetworkv6 = 23,
  35.         Irda = 26,
  36.         BlueTooth = 32
  37.     }
  38.     public enum SocketType : int
  39.     {
  40.         Unknown = 0,
  41.         Stream = 1,
  42.         DGram = 2,
  43.         Raw = 3,
  44.         Rdm = 4,
  45.         SeqPacket = 5
  46.     }
  47.     public enum ProtocolType : int
  48.     {
  49.         BlueTooth = 3,
  50.         Tcp = 6,
  51.         Udp = 17,
  52.         ReliableMulticast = 113
  53.     }
  54.  
  55.     // Equivilent to C++s "SOCKET"
  56.     public unsafe struct SOCKET
  57.     {
  58.         private void* handle;
  59.         private SOCKET(int _handle)
  60.         {
  61.             handle = (void*)_handle;
  62.         }
  63.         public static bool operator ==(SOCKET s, int i)
  64.         {
  65.             return ((int)s.handle == i);
  66.         }
  67.         public static bool operator !=(SOCKET s, int i)
  68.         {
  69.             return ((int)s.handle != i);
  70.         }
  71.         public static implicit operator SOCKET(int i)
  72.         {
  73.             return new SOCKET(i);
  74.         }
  75.         public static implicit operator uint(SOCKET s)
  76.         {
  77.             return (uint)s.handle;
  78.         }
  79.         public override bool Equals(object obj)
  80.         {
  81.             return (obj is SOCKET) ? (((SOCKET)obj).handle == this.handle) : base.Equals(obj);
  82.         }
  83.         public override int GetHashCode()
  84.         {
  85.             return (int)handle;
  86.         }
  87.     }
  88.  
  89.  
  90.     public struct timeval
  91.     {
  92.         public long tv_sec;
  93.         public long tv_usec;
  94.     }
  95.  
  96.  
  97.     // fd_set used in 'select' method
  98.     public unsafe struct fd_set
  99.     {
  100.         public const int FD_SETSIZE = 64;
  101.         public uint fd_count;
  102.         public fixed uint fd_array[FD_SETSIZE];
  103.     }
  104.  
  105.     // C# equivilent to C++'s sockaddr_in / SOCKADDR_IN
  106.     [StructLayout(LayoutKind.Sequential, Size = 16)]
  107.     public struct sockaddr_in
  108.     {
  109.         public const int Size = 16;
  110.  
  111.         public short sin_family;
  112.         public ushort sin_port;
  113.         public struct in_addr
  114.         {
  115.             public uint S_addr;
  116.             public struct _S_un_b
  117.             {
  118.                 public byte s_b1, s_b2, s_b3, s_b4;
  119.             }
  120.             public _S_un_b S_un_b;
  121.             public struct _S_un_w
  122.             {
  123.                 public ushort s_w1, s_w2;
  124.             }
  125.             public _S_un_w S_un_w;
  126.         }
  127.         public in_addr sin_addr;
  128.     }
  129.  
  130.     // WSAData structure, used in WSAStarutp
  131.     [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
  132.     public unsafe struct WSAData
  133.     {
  134.         public ushort Version;
  135.         public ushort HighVersion;
  136.         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 257)]
  137.         public string Description;
  138.         [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 129)]
  139.         public string SystemStatus;
  140.         public ushort MaxSockets;
  141.         public ushort MaxUdpDg;
  142.         sbyte* lpVendorInfo;
  143.     }
  144.  
  145.     // Interface to ws2_32.dll
  146.     public unsafe partial class Native
  147.     {
  148.         public const int AF_INET = 2;
  149.         public const int SOCK_STREAM = 1;
  150.         public const int PPROTO_TCP = 6;
  151.  
  152.         public const long FIONBIO    = 0x8004667E;
  153.         public const string INADDR_ANY = "0.0.0.0";
  154.          
  155.         public const int SOCKET_ERROR = -1;
  156.         public const int INVALID_SOCKET = ~0;
  157.  
  158.  
  159.         [DllImport("Ws2_32.dll")]
  160.         public static extern int WSAStartup(ushort Version, out WSAData Data);
  161.  
  162.         [DllImport("Ws2_32.dll")]
  163.         public static extern SocketError WSAGetLastError();
  164.  
  165.         [DllImport("Ws2_32.dll")]
  166.         public static extern SOCKET socket(AddressFamily af, SocketType type,
  167.                                             ProtocolType protocol);
  168.  
  169.         [DllImport("Ws2_32.dll")]
  170.         public static extern int send(SOCKET s, char* buf, int len, int flags);
  171.  
  172.         [DllImport("Ws2_32.dll")]
  173.         public static extern int recv(SOCKET s, char* buf, int len, int flags);
  174.  
  175.         [DllImport("Ws2_32.dll")]
  176.         public static extern SOCKET accept(SOCKET s, void* addr, int* addrsize);
  177.  
  178.         [DllImport("Ws2_32.dll")]
  179.         public static extern int listen(SOCKET s, int backlog);
  180.  
  181.         [DllImport("Ws2_32.dll", CharSet = CharSet.Ansi)]
  182.         public static extern uint inet_addr(string cp);
  183.  
  184.         [DllImport("Ws2_32.dll")]
  185.         public static extern ushort htons(ushort hostshort);
  186.  
  187.         [DllImport("Ws2_32.dll")]
  188.         public static extern int connect(SOCKET s, sockaddr_in* addr, int addrsize);
  189.  
  190.         [DllImport("Ws2_32.dll")]
  191.         public static extern int ioctlsocket(SOCKET s, long cmd, ulong* argp);
  192.  
  193.         [DllImport("Ws2_32.dll")]
  194.         public static extern int closesocket(SOCKET s);
  195.  
  196.         [DllImport("Ws2_32.dll")]
  197.         public static extern int bind(SOCKET s, sockaddr_in* addr, int addrsize);
  198.  
  199.         [DllImport("Ws2_32.dll")]
  200.         public static extern int select(int ndfs, fd_set* readfds, fd_set* writefds,
  201.                                          fd_set* exceptfds, timeval* timeout);
  202.  
  203.         [DllImport("Ws2_32.dll")]
  204.         public static extern sbyte* inet_ntoa(sockaddr_in.in_addr _in);
  205.  
  206.         [DllImport("Ws2_32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  207.         public static extern Int32 WSACleanup();
  208.  
  209.         public SOCKET clientSocket;
  210.         public SOCKET serverSocket;
  211.  
  212.         public bool Listen(ushort port)
  213.         {
  214.             WSAData wsaData = new WSAData();
  215.             int startupResult = Native.WSAStartup(/*MAKEWORD(2, 2)*/514, out wsaData);
  216.             if (startupResult == Native.SOCKET_ERROR)
  217.             {
  218.                 Console.WriteLine("WSA start-up error code: " + wsaData.ToString());
  219.                 return false;
  220.             }
  221.  
  222.             // [ 1 ] Set-up socket
  223.             serverSocket = Native.socket(AddressFamily.InterNetworkv4, SocketType.Stream,
  224.                             ProtocolType.Tcp);
  225.             if (serverSocket == INVALID_SOCKET)
  226.             {
  227.                 Console.WriteLine("Creating socket: " + Native.WSAGetLastError().ToString());
  228.                 return false;
  229.             }
  230.  
  231.             // [ 2 ] Bind socket to ip adress and port of the server
  232.             sockaddr_in sockaddr = new sockaddr_in();
  233.  
  234.             sockaddr.sin_family = AF_INET;
  235.             sockaddr.sin_addr.S_addr = Native.inet_addr(INADDR_ANY);
  236.             sockaddr.sin_port = Native.htons(port);
  237.  
  238.             int bindResult = Native.bind(serverSocket, &sockaddr, Marshal.SizeOf(sockaddr));
  239.             if (bindResult == SOCKET_ERROR)
  240.             {
  241.                 Console.WriteLine("Bind: " + Native.WSAGetLastError().ToString());
  242.                 return false;
  243.             }
  244.  
  245.             // [ 3 ] Try to listen
  246.             int listenResult = Native.listen(serverSocket, 1);
  247.             if (listenResult == SOCKET_ERROR)
  248.             {
  249.                 Console.WriteLine("Listen: " + Native.WSAGetLastError().ToString());
  250.                 return false;
  251.             }
  252.  
  253.  
  254.             while (true) {
  255.            
  256.                 // [ 4 ] Accept connection
  257.                 SOCKET tempSocket = SOCKET_ERROR;
  258.                 sockaddr_in temp_sockaddr = new sockaddr_in();
  259.                 int temp_len = Marshal.SizeOf(temp_sockaddr);
  260.  
  261.                 while (tempSocket == SOCKET_ERROR)
  262.                 {
  263.                     tempSocket = Native.accept(serverSocket, &temp_sockaddr, &temp_len);
  264.                     if (tempSocket == -1)
  265.                         continue;
  266.                     RecieveMessage(tempSocket);
  267.                     SendMessage("toi toi", tempSocket);
  268.                 }
  269.                 serverSocket = tempSocket;
  270.             }
  271.         }
  272.  
  273.         private bool Client(string address, ushort port)
  274.         {
  275.             WSAData wsaData = new WSAData();
  276.             int startupResult = Native.WSAStartup(/*MAKEWORD(2, 2)*/514, out wsaData);
  277.             if (startupResult == Native.SOCKET_ERROR)
  278.             {
  279.                 Console.WriteLine("WSA start-up error code: " + wsaData.ToString());
  280.                 return false;
  281.             }
  282.  
  283.             // [ 1 ] Set-up socket
  284.             serverSocket = Native.socket(AddressFamily.InterNetworkv4, SocketType.Stream,
  285.                             ProtocolType.Tcp);
  286.             if (serverSocket == INVALID_SOCKET)
  287.             {
  288.                 Console.WriteLine("Creating socket: " + Native.WSAGetLastError().ToString());
  289.                 return false;
  290.             }
  291.  
  292.             // [ 2 ] Connect
  293.             sockaddr_in sockaddr = new sockaddr_in();
  294.  
  295.             sockaddr.sin_family = AF_INET;
  296.             sockaddr.sin_addr.S_addr = Native.inet_addr(address);
  297.             sockaddr.sin_port = Native.htons(port);
  298.  
  299.             int connectResult = Native.connect(clientSocket, &sockaddr, Marshal.SizeOf(sockaddr));
  300.             if (connectResult == SOCKET_ERROR)
  301.             {
  302.                 Console.WriteLine("Connecting to server: " + Native.WSAGetLastError().ToString());
  303.                 return false;
  304.             }
  305.  
  306.             return true;
  307.         }
  308.  
  309.  
  310.         private unsafe string RecieveMessage(SOCKET socket)
  311.         {
  312.             char[] recvArr = new char[8];
  313.             int recvResult = -2; // -2 точно не сможет вернуть recv
  314.             string message;
  315.  
  316.             fixed (char* recvBuf = recvArr)
  317.             {
  318.                 recvResult = Native.recv(socket, recvBuf, 8, 0);
  319.                 message = new string(recvBuf);
  320.                 if (recvResult == SOCKET_ERROR)
  321.                 {
  322.                     Console.WriteLine("Recive: " + Native.WSAGetLastError().ToString());
  323.                     Native.closesocket(socket);
  324.                     return "R";
  325.                 }
  326.             }
  327.             if (message.Length > 0)
  328.                 return message;
  329.             else
  330.                 return "R";
  331.         }
  332.  
  333.         private unsafe bool SendMessage(string message, SOCKET socket)
  334.         {
  335.             fixed (char* pbuf = message)
  336.             {
  337.                 int sendResult = Native.send(socket, pbuf, 8, 0);
  338.                 if (sendResult == SOCKET_ERROR)
  339.                 {
  340.                     Console.WriteLine("Sending: " + Native.WSAGetLastError().ToString());
  341.                     Native.closesocket(socket);
  342.                     return false;
  343.                 }
  344.             }
  345.             return true;
  346.         }
  347.  
  348.     }
  349. }
Add Comment
Please, Sign In to add comment