/// <summary> /// Handle request. /// </summary> /// <param name="acceptedSocket"></param> private void HandleAcceptedRequest(Socket acceptedSocket) { try { while (true) { int receivedLength = acceptedSocket.ReceiveMessageAndFileDescriptor( out byte[] messageBuffer, out var sharedMemoryFd); if (receivedLength == 0) { // Disconnected. // return; } string sharedMemoryName = Encoding.ASCII.GetString(messageBuffer); if (sharedMemoryFd != Native.InvalidPointer) { // Store received file descriptor in the dictionary. // lock (fileDescriptors) { fileDescriptors.Add(sharedMemoryName, sharedMemoryFd); } } else { lock (fileDescriptors) { if (fileDescriptors.ContainsKey(sharedMemoryName)) { sharedMemoryFd = fileDescriptors[sharedMemoryName]; } } FileDescriptorExchangeMessage msg = default; acceptedSocket.SendMessageAndFileDescriptor( ref msg, sharedMemoryFd); } } } catch { // #TODO verify is disconnected // } }
/// <summary> /// Handle request. /// </summary> /// <param name="acceptedSocket"></param> private void HandleAcceptedRequest(Socket acceptedSocket) { try { while (true) { FileDescriptorExchangeMessage msg = default; acceptedSocket.ReceiveMessageAndFileDescriptor(ref msg, out IntPtr sharedMemoryFd); if (msg.ContainsFd) { // Store received file descriptor in the dictionary. // fileDescriptors.Add( msg.MemoryRegionId, new AnonymousSharedMemory { SharedMemoryFd = sharedMemoryFd, SharedMemorySize = msg.MemoryRegionSize, }); } else { if (fileDescriptors.ContainsKey(msg.MemoryRegionId)) { AnonymousSharedMemory sharedMemory = fileDescriptors[msg.MemoryRegionId]; msg.ContainsFd = true; msg.MemoryRegionSize = sharedMemory.SharedMemorySize; acceptedSocket.SendMessageAndFileDescriptor( ref msg, sharedMemory.SharedMemoryFd); } else { // Replay we do not have require memory region. // msg.ContainsFd = false; acceptedSocket.SendMessageAndFileDescriptor( ref msg, IntPtr.Zero); } } } } catch { // #TODO verify is disconnected // } }