private Mapping CreatePortMap(Mapping mapping, bool create) { List <byte> package = new List <byte> (); package.Add(PmpConstants.Version); package.Add(mapping.Protocol == Protocol.Tcp ? PmpConstants.OperationCodeTcp : PmpConstants.OperationCodeUdp); package.Add((byte)0); //reserved package.Add((byte)0); //reserved package.AddRange(BitConverter.GetBytes(IPAddress.HostToNetworkOrder((short)mapping.PrivatePort))); package.AddRange(BitConverter.GetBytes(create ? IPAddress.HostToNetworkOrder((short)mapping.PublicPort) : (short)0)); package.AddRange(BitConverter.GetBytes(IPAddress.HostToNetworkOrder(mapping.Lifetime))); CreatePortMapAsyncState state = new CreatePortMapAsyncState(); state.Buffer = package.ToArray(); state.Mapping = mapping; ThreadPool.QueueUserWorkItem(new WaitCallback(CreatePortMapAsync), state); #if SSHARP state.ResetEvent.Wait(); #else WaitHandle.WaitAll(new WaitHandle[] { state.ResetEvent }); #endif if (!state.Success) { string type = create ? "create" : "delete"; throw new MappingException(String.Format("Failed to {0} portmap (protocol={1}, private port={2}", type, mapping.Protocol, mapping.PrivatePort)); } return(state.Mapping); }
internal static bool WaitOne(WaitHandle waitHandle, int millisecondsTimeout, bool exitContext) { return(waitHandle.WaitOne(millisecondsTimeout, exitContext)); }