示例#1
0
        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));
 }