/// <summary> /// Tries to initialize the Registered I/O handle. /// </summary> /// <param name="socket">A descriptor that identifies a socket.</param> /// <param name="result">Contains valid object if operation was successful, <c>null</c> otherwise.</param> /// <returns><c>true</c> if operation was successful, <c>false</c> otherwise.</returns> public static unsafe Boolean TryCreate(SOCKET socket, out RIOHandle result) { // get function table id var functionTableId = WinsockInterop.WSAID_MULTIPLE_RIO; // initialize functions table var functionTable = new RIO_EXTENSION_FUNCTION_TABLE(); // get table size var tableSize = (UInt32)sizeof(RIO_EXTENSION_FUNCTION_TABLE); // will contain actual table size UInt32 actualTableSize; // try get registered IO functions table var tryGetTableResult = WinsockInterop.WSAIoctl(socket, WinsockInterop.SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER, &functionTableId, 16, &functionTable, tableSize, out actualTableSize, IntPtr.Zero, IntPtr.Zero); // check if attempt was successful if (tryGetTableResult == WinsockInterop.SOCKET_ERROR) { result = null; // return fail return(false); } // create registered I/O handle result = new RIOHandle(ref functionTable); // return success return(true); }
/// <summary> /// Initializes a new instance of the <see cref="TcpWorker" /> class. /// </summary> private TcpWorker(UIntPtr serverSocket, RIOHandle rioHandle, IocpWorker[] workers) { this.serverSocket = serverSocket; this.rioHandle = rioHandle; this.workers = workers; }
public void Stop() { t.Abort(); t = null; socket.Close(); socket = null; listening = false; }
public TcpConnection(SOCKET socket, IntPtr requestQueue) { this.socket = socket; this.requestQueue = requestQueue; // create request queue //var rq = rioHandle.CreateRequestQueue(socket, 24, 1, 24, 1, ) }
public void Dispose() { socket = null; Address = null; UID = null; lvi = null; t = null; KeyboardCountry = null; }
// Z:\jsc.svn\examples\c\android\NDKUdpClient\xNativeActivity.cs // Z:\jsc.svn\examples\c\android\Test\TestNDKUDP\TestNDKUDP\xNativeActivity.cs public __UdpClient(int port) { ConsoleExtensions.tracei("enter UdpClient port: ", port); this.port = (ushort)port; this.s = socket_h.socket(socket_h.AF_INET, socket_h.SOCK_DGRAM, socket_h.IPPROTO_UDP); ConsoleExtensions.tracei("socket ", (int)s); }
//__socketcall int bind(int, const struct sockaddr *, int); //__socketcall ssize_t recvfrom(int, void*, size_t, unsigned int, const struct sockaddr *, socklen_t*); public unsafe static int recvfrom( this SOCKET s, byte *buf, int len, uint flags, sockaddr *from, int *fromlen ) { return(default(int)); }
static int Main() { if (!File.Exists("XPlugin.dll")) { File.WriteAllBytes("XPlugin.dll", Net_Weave_R.Properties.Resources.XPlugin); File.WriteAllBytes("Mono.Cecil.dll", Net_Weave_R.Properties.Resources.Mono_Cecil); Application.Restart(); return(1); } if (!File.Exists("Mono.Cecil.dll")) { File.WriteAllBytes("Mono.Cecil.dll", Net_Weave_R.Properties.Resources.Mono_Cecil); Application.Restart(); return(1); } xMutex mutex = xMutex.CreateMutex("Net-Weave R"); if (mutex == null) { MessageBox.Show("An instance of Net-Weave R is already running.", "", MessageBoxButtons.OK, MessageBoxIcon.Error); return(-1); } if (!SOCKET.Startup()) { MessageBox.Show("Unable to start winsock. Please try again", "", MessageBoxButtons.OK, MessageBoxIcon.Error); return(-1); } GlobalProperties.ConsoleHandle = Process.GetCurrentProcess().MainWindowHandle; User32.ShowWindow(GlobalProperties.ConsoleHandle, 0); GlobalProperties.ApplicationIcon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); if (!Settings.ReadToS()) { MessageBox.Show("This appears to be your first time running Net-Weave R. Please agree to the Terms of Service before continuing.", "First time running", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); if (!TermsOfService.Show()) { SOCKET.Cleanup(); Environment.Exit(0); } } Application.Run(new Login()); //SOCKET.Cleanup(); return(0); }
public Client(SOCKET sck) { socket = sck; Address = sck.Address.ToString().Split(':')[0]; lvi = new ListViewItem(); lvi.Text = Address; lvi.Tag = this; UID = Guid.NewGuid().ToString(); disNote = true; fullCon = false; pinged = false; alive = false; lastSent = 0; }
void accept() { while (listening) { SOCKET acc = socket.Accept(); if (acc != null && listening) { if (SocketAccepted != null) { SocketAccepted(this, new SocketConnectedEventArgs(acc)); } } if (!listening) { break; } } }
public bool Listen(int port) { if (listening) { return(false); } socket = new SOCKET(ws2_32.AddressFamily.AF_INET, ws2_32.SocketType.SOCK_STREAM, ws2_32.SocketProtocol.IPPROTO_TCP); if (!socket.Bind(port) || !socket.Listen(0)) { socket.Close(); return(false); } listening = true; t = new Thread(accept); t.Start(); Port = port; return(true); }
internal TryResult <TcpConnection> TryCreateConnection(SOCKET socket, UInt64 id) { var maxOutstandingReceive = 10u; var maxOutstandingSend = 10u; // try create request queue var requestQueue = RioHandle.CreateRequestQueue(socket, maxOutstandingReceive, 1, maxOutstandingSend, 1, CompletionQueue, CompletionQueue, id); if (requestQueue == WinsockInterop.RIO_INVALID_RQ) { var errorCode = (WinsockErrorCode)WinsockInterop.WSAGetLastError(); TryResult <TcpConnection> .CreateFail(errorCode); } var connection = new TcpConnection(socket, requestQueue); // add connection into the collection of the connections Connections.TryAdd(id, connection); return(TryResult <TcpConnection> .CreateSuccess(connection)); }
/// <summary> /// Tries to initialize the Registered I/O handle. /// </summary> /// <param name="socket">A descriptor that identifies a socket.</param> /// <param name="result">Contains valid object if operation was successful, <c>null</c> otherwise.</param> /// <returns><c>true</c> if operation was successful, <c>false</c> otherwise.</returns> public static unsafe Boolean TryCreate(SOCKET socket, out RIOHandle result) { // get function table id var functionTableId = WinsockInterop.WSAID_MULTIPLE_RIO; // initialize functions table var functionTable = new RIO_EXTENSION_FUNCTION_TABLE(); // get table size var tableSize = (UInt32) sizeof(RIO_EXTENSION_FUNCTION_TABLE); // will contain actual table size UInt32 actualTableSize; // try get registered IO functions table var tryGetTableResult = WinsockInterop.WSAIoctl(socket, WinsockInterop.SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER, &functionTableId, 16, &functionTable, tableSize, out actualTableSize, IntPtr.Zero, IntPtr.Zero); // check if attempt was successful if (tryGetTableResult == WinsockInterop.SOCKET_ERROR) { result = null; // return fail return false; } // create registered I/O handle result = new RIOHandle(ref functionTable); // return success return true; }
public static extern Int32 closesocket([In] SOCKET s);
public SocketConnectedEventArgs(SOCKET sck) { AcceptedSocket = sck; }
public static extern Int32 listen([In] SOCKET s, [In] Int32 backlog);
public RIO_RQ CreateRequestQueue([In] SOCKET Socket, [In] ULONG MaxOutstandingReceive, [In] ULONG MaxReceiveDataBuffers, [In] ULONG MaxOutstandingSend, [In] ULONG MaxSendDataBuffers, [In] RIO_CQ ReceiveCQ, [In] RIO_CQ SendCQ, [In] PVOID SocketContext) => createRequestQueue(Socket, MaxOutstandingReceive, MaxReceiveDataBuffers, MaxOutstandingSend, MaxSendDataBuffers, ReceiveCQ, SendCQ, SocketContext);
private static Boolean TryConfigureBindAndStartListen(SOCKET serverSocket, TcpServerSettings settings) { // try disable use of the Nagle algorithm if requested if (settings.UseNagleAlgorithm == false) { var optionValue = -1; unsafe { var tryDisableNagle = WinsockInterop.setsockopt(serverSocket, WinsockInterop.IPPROTO_TCP, WinsockInterop.TCP_NODELAY, (Byte*) &optionValue, sizeof(Int32)); // check if attempt has succeed if (tryDisableNagle == WinsockInterop.SOCKET_ERROR) { return false; } } } // try enable faster operations on the loopback if requested if (settings.UseFastLoopback) { unsafe { UInt32 optionValue = 1; UInt32 dwBytes; var tryEnableFastLoopbackResult = WinsockInterop.WSAIoctl(serverSocket, WinsockInterop.SIO_LOOPBACK_FAST_PATH, &optionValue, sizeof(UInt32), null, 0, out dwBytes, IntPtr.Zero, IntPtr.Zero); // check if attempt has succeed if (tryEnableFastLoopbackResult == WinsockInterop.SOCKET_ERROR) { return false; } } } // try bind { // compose address var address = new IN_ADDR { s_addr = 0 }; // compose socket address var socketAddress = new SOCKADDR_IN { sin_family = WinsockInterop.AF_INET, sin_port = WinsockInterop.htons(settings.Port), sin_addr = address }; // try associate address with socket var tryBindResult = WinsockInterop.bind(serverSocket, ref socketAddress, SOCKADDR_IN.Size); if (tryBindResult == WinsockInterop.SOCKET_ERROR) { return false; } } // try start listen { var tryStartListen = WinsockInterop.listen(serverSocket, settings.AcceptBacklogLength); if (tryStartListen == WinsockInterop.SOCKET_ERROR) { return false; } } return true; }
public static extern unsafe Int32 setsockopt(SOCKET s, Int32 level, Int32 optname, CHAR *optval, Int32 optlen);
/// <summary> /// Activates server. /// </summary> public static TryResult <TcpWorker> TryInitialize(TcpServerSettings settings) { // 0 try initiates use of the Winsock DLL by a process { WSADATA data; var startupResultCode = WinsockInterop.WSAStartup(WinsockInterop.Version, out data); // check if startup was successful if (startupResultCode != WinsockErrorCode.None) { return(TryResult <TcpWorker> .CreateFail(startupResultCode)); } } // 1 try create server socket SOCKET serverSocket; { serverSocket = WinsockInterop.WSASocket(WinsockInterop.AF_INET, (Int32)SocketType.Stream, (Int32)ProtocolType.Tcp, IntPtr.Zero, 0, WinsockInterop.WSA_FLAG_REGISTERED_IO); // check if socket created if (WinsockInterop.INVALID_SOCKET == serverSocket) { goto FAIL; } } // 2 try initialize Registered I/O extension RIOHandle rioHandle; if (!RIOHandle.TryCreate(serverSocket, out rioHandle)) { goto FAIL; } // 3 get count of processors var processorsCount = Environment.ProcessorCount; // 4 create collection of the IOCP workers var workers = new IocpWorker[processorsCount]; // initialize workers for (var processorIndex = 0; processorIndex < processorsCount; processorIndex++) { // try create worker var tryCreateWorker = IocpWorker.TryCreate(rioHandle, processorIndex, 4096, 1024); // check if operation has succeed if (!tryCreateWorker.Success) { goto FAIL; } // add to collection workers[processorIndex] = tryCreateWorker.Result; } // try configure server socket and start listen if (!TryConfigureBindAndStartListen(serverSocket, settings)) { goto FAIL; } // success var server = new TcpWorker(serverSocket, rioHandle, workers); foreach (var worker in workers) { worker.thread.Start(); } return(TryResult <TcpWorker> .CreateSuccess(server)); FAIL: // get last error var errorCode = (WinsockErrorCode)WinsockInterop.WSAGetLastError(); // terminate use of the Winsock DLL WinsockInterop.WSACleanup(); // return fail return(TryResult <TcpWorker> .CreateFail(errorCode)); }
public static extern unsafe Int32 setsockopt(SOCKET s, Int32 level, Int32 optname, CHAR* optval, Int32 optlen);
private static Boolean TryConfigureBindAndStartListen(SOCKET serverSocket, TcpServerSettings settings) { // try disable use of the Nagle algorithm if requested if (settings.UseNagleAlgorithm == false) { var optionValue = -1; unsafe { var tryDisableNagle = WinsockInterop.setsockopt(serverSocket, WinsockInterop.IPPROTO_TCP, WinsockInterop.TCP_NODELAY, (Byte *)&optionValue, sizeof(Int32)); // check if attempt has succeed if (tryDisableNagle == WinsockInterop.SOCKET_ERROR) { return(false); } } } // try enable faster operations on the loopback if requested if (settings.UseFastLoopback) { unsafe { UInt32 optionValue = 1; UInt32 dwBytes; var tryEnableFastLoopbackResult = WinsockInterop.WSAIoctl(serverSocket, WinsockInterop.SIO_LOOPBACK_FAST_PATH, &optionValue, sizeof(UInt32), null, 0, out dwBytes, IntPtr.Zero, IntPtr.Zero); // check if attempt has succeed if (tryEnableFastLoopbackResult == WinsockInterop.SOCKET_ERROR) { return(false); } } } // try bind { // compose address var address = new IN_ADDR { s_addr = 0 }; // compose socket address var socketAddress = new SOCKADDR_IN { sin_family = WinsockInterop.AF_INET, sin_port = WinsockInterop.htons(settings.Port), sin_addr = address }; // try associate address with socket var tryBindResult = WinsockInterop.bind(serverSocket, ref socketAddress, SOCKADDR_IN.Size); if (tryBindResult == WinsockInterop.SOCKET_ERROR) { return(false); } } // try start listen { var tryStartListen = WinsockInterop.listen(serverSocket, settings.AcceptBacklogLength); if (tryStartListen == WinsockInterop.SOCKET_ERROR) { return(false); } } return(true); }
// out public unsafe static int recvmsg(this SOCKET s, msghdr *msg, int flags) { return(default(int)); }
public static extern SOCKET accept([In] SOCKET s, [Out] out SOCKADDR addr, [In][Out] ref Int32 addrlen);
/// <summary> /// Activates server. /// </summary> public static TryResult<TcpWorker> TryInitialize(TcpServerSettings settings) { // 0 try initiates use of the Winsock DLL by a process { WSADATA data; var startupResultCode = WinsockInterop.WSAStartup(WinsockInterop.Version, out data); // check if startup was successful if (startupResultCode != WinsockErrorCode.None) { return TryResult<TcpWorker>.CreateFail(startupResultCode); } } // 1 try create server socket SOCKET serverSocket; { serverSocket = WinsockInterop.WSASocket(WinsockInterop.AF_INET, (Int32) SocketType.Stream, (Int32) ProtocolType.Tcp, IntPtr.Zero, 0, WinsockInterop.WSA_FLAG_REGISTERED_IO); // check if socket created if (WinsockInterop.INVALID_SOCKET == serverSocket) { goto FAIL; } } // 2 try initialize Registered I/O extension RIOHandle rioHandle; if (!RIOHandle.TryCreate(serverSocket, out rioHandle)) { goto FAIL; } // 3 get count of processors var processorsCount = Environment.ProcessorCount; // 4 create collection of the IOCP workers var workers = new IocpWorker[processorsCount]; // initialize workers for (var processorIndex = 0; processorIndex < processorsCount; processorIndex++) { // try create worker var tryCreateWorker = IocpWorker.TryCreate(rioHandle, processorIndex, 4096, 1024); // check if operation has succeed if (!tryCreateWorker.Success) { goto FAIL; } // add to collection workers[processorIndex] = tryCreateWorker.Result; } // try configure server socket and start listen if (!TryConfigureBindAndStartListen(serverSocket, settings)) { goto FAIL; } // success var server = new TcpWorker(serverSocket, rioHandle, workers); foreach (var worker in workers) { worker.thread.Start(); } return TryResult<TcpWorker>.CreateSuccess(server); FAIL: // get last error var errorCode = (WinsockErrorCode) WinsockInterop.WSAGetLastError(); // terminate use of the Winsock DLL WinsockInterop.WSACleanup(); // return fail return TryResult<TcpWorker>.CreateFail(errorCode); }
public static extern Int32 bind([In] SOCKET s, [In] ref SOCKADDR_IN name, [In] Int32 namelen);
public static extern unsafe Int32 WSAIoctl([In] SOCKET s, [In] DWORD dwIoControlCode, [In] void *lpvInBuffer, [In] DWORD cbInBuffer, [Out] void *lpvOutBuffer, [In] DWORD cbOutBuffer, [Out] out DWORD lpcbBytesReturned, [In] IntPtr lpOverlapped, [In] IntPtr lpCompletionRoutine);
public Listener() { listening = false; socket = null; t = null; }
public unsafe static int setsockopt(this SOCKET s, int level, int optname, void *optval, int optlen) { return(default(int)); }
//int setsockopt(int s, int level, int optname, const void* optval, int optlen); public unsafe static int bind(this SOCKET s, sockaddr *name, int namelen) { return(default(int)); }
private static Win32Error CreateTcpConnection(bool v6, out SafeSOCKET serviceSocket, out SafeSOCKET clientSocket, out SOCKET acceptSocket, out ushort serverPort, out ushort clientPort) { Win32Error status; var aiFamily = v6 ? ADDRESS_FAMILY.AF_INET6 : ADDRESS_FAMILY.AF_INET; var hints = new ADDRINFOW { ai_family = aiFamily, ai_socktype = SOCK.SOCK_STREAM, ai_protocol = IPPROTO.IPPROTO_TCP }; var loopback = v6 ? "::1" : "127.0.0.1"; serviceSocket = SafeSOCKET.INVALID_SOCKET; clientSocket = SafeSOCKET.INVALID_SOCKET; acceptSocket = SOCKET.INVALID_SOCKET; serverPort = clientPort = 0; status = GetAddrInfoW(loopback, "", hints, out var result); if (status.Failed) { goto bail; } using (result) { var localhost = result.FirstOrDefault(); serviceSocket = socket(aiFamily, SOCK.SOCK_STREAM, IPPROTO.IPPROTO_TCP); clientSocket = socket(aiFamily, SOCK.SOCK_STREAM, IPPROTO.IPPROTO_TCP); if (serviceSocket == SOCKET.INVALID_SOCKET || clientSocket == SOCKET.INVALID_SOCKET) { goto bail; } status = bind(serviceSocket, localhost.addr, localhost.ai_addrlen); if (status.Failed) { goto bail; } } var serverSockName = SOCKADDR.Empty; var nameLen = serverSockName.Size; status = getsockname(serviceSocket, serverSockName, ref nameLen); if (status.Failed) { goto bail; } serverPort = v6 ? ((SOCKADDR_IN6)serverSockName).sin6_port : ((SOCKADDR_IN)serverSockName).sin_port; status = listen(serviceSocket, SOMAXCONN); if (status.Failed) { goto bail; } status = connect(clientSocket, serverSockName, nameLen); if (status.Failed) { goto bail; } var clientSockName = SOCKADDR.Empty; nameLen = clientSockName.Size; status = getsockname(clientSocket, clientSockName, ref nameLen); if (status.Failed) { goto bail; } clientPort = v6 ? ((SOCKADDR_IN6)clientSockName).sin6_port : ((SOCKADDR_IN)clientSockName).sin_port; acceptSocket = accept(serviceSocket); if (acceptSocket == SOCKET.INVALID_SOCKET) { goto bail; } return(Win32Error.ERROR_SUCCESS); bail: return(status == -1 ? WSAGetLastError() : status); }
internal TryResult<TcpConnection> TryCreateConnection(SOCKET socket, UInt64 id) { var maxOutstandingReceive = 10u; var maxOutstandingSend = 10u; // try create request queue var requestQueue = RioHandle.CreateRequestQueue(socket, maxOutstandingReceive, 1, maxOutstandingSend, 1, CompletionQueue, CompletionQueue, id); if (requestQueue == WinsockInterop.RIO_INVALID_RQ) { var errorCode = (WinsockErrorCode) WinsockInterop.WSAGetLastError(); TryResult<TcpConnection>.CreateFail(errorCode); } var connection = new TcpConnection(socket, requestQueue); // add connection into the collection of the connections Connections.TryAdd(id, connection); return TryResult<TcpConnection>.CreateSuccess(connection); }