public PeerNameResolver(string peerName, int numberOfResultsRequested, PnrpResolveCriteria resolveCriteria, uint scopeId, string cloudName, TimeSpan timeout, List<PnrpRegistration> results) : base(null, null) { // pnrp has a hard-coded limit on the timeout value that can be passed to it // maximum value is 10 minutes if (timeout > MaxTimeout) { timeout = MaxTimeout; } timeoutHelper = new TimeoutHelper(timeout); PnrpInfo resolveQueryInfo = new PnrpInfo(); resolveQueryInfo.dwSize = Marshal.SizeOf(typeof(PnrpInfo)); resolveQueryInfo.nMaxResolve = numberOfResultsRequested; resolveQueryInfo.dwTimeout = (int)timeout.TotalSeconds; resolveQueryInfo.dwLifetime = 0; resolveQueryInfo.enNameState = 0; resolveQueryInfo.lpwszIdentity = null; resolveQueryInfo.dwFlags = PNRPINFO_HINT; IPEndPoint hint = PnrpPeerResolver.GetHint(); resolveQueryInfo.enResolveCriteria = resolveCriteria; resolveQueryInfo.saHint = SOCKET_ADDRESS_SAFE.SocketAddressFromIPEndPoint(hint); resolveQuery = new WsaQuerySet(); resolveQuery.ServiceInstanceName = peerName; resolveQuery.ServiceClassId = SvcIdNameV1; resolveQuery.NameSpace = NspNamespaces.Name; resolveQuery.NSProviderId = NsProviderName; resolveQuery.Context = cloudName; resolveQuery.Blob = resolveQueryInfo; this.results = results; this.scopeId = scopeId; ActionItem.Schedule(new Action<object>(SyncEnumeration), null); }
public void Register(PnrpRegistration registration, TimeSpan timeout) { // fill in the PnrpInfo blob using the defaults PnrpInfo pnrpInfo = new PnrpInfo(); pnrpInfo.dwLifetime = RegistrationLifetime; pnrpInfo.lpwszIdentity = null; pnrpInfo.dwSize = Marshal.SizeOf(pnrpInfo); pnrpInfo.dwFlags = PNRPINFO_HINT; IPEndPoint hint = PnrpPeerResolver.GetHint(); pnrpInfo.saHint = SOCKET_ADDRESS_SAFE.SocketAddressFromIPEndPoint(hint); // fill in the query set WsaQuerySet registerQuery = new WsaQuerySet(); registerQuery.NameSpace = NspNamespaces.Name; registerQuery.NSProviderId = NsProviderName; registerQuery.ServiceClassId = SvcIdNameV1; registerQuery.ServiceInstanceName = registration.PeerName; registerQuery.Comment = registration.Comment; registerQuery.Context = registration.CloudName; // copy over the addresses if (registration.Addresses != null) { Fx.Assert(registration.Addresses.Length <= 4, "Pnrp supports only 4 addresses"); registerQuery.CsAddrInfos = new CsAddrInfo[registration.Addresses.Length]; for (int i = 0; i < registration.Addresses.Length; i++) { // the only interesting part of the CsAddrInfo is the LocalAddress registerQuery.CsAddrInfos[i].LocalAddr = registration.Addresses[i]; registerQuery.CsAddrInfos[i].iProtocol = (int)ProtocolType.Tcp; registerQuery.CsAddrInfos[i].iSocketType = (int)SocketType.Stream; } } // copy the blob registerQuery.Blob = pnrpInfo; RegisterService(registerQuery); }
public void Unregister(string peerName, string cloudName, TimeSpan timeout) { // fill in the PnrpInfo with defaults PnrpInfo identityInfo = new PnrpInfo(); identityInfo.lpwszIdentity = null; identityInfo.dwSize = Marshal.SizeOf(typeof(PnrpInfo)); // fill in the query set WsaQuerySet registerQuery = new WsaQuerySet(); registerQuery.NameSpace = NspNamespaces.Name; registerQuery.NSProviderId = NsProviderName; registerQuery.ServiceClassId = SvcIdNameV1; registerQuery.ServiceInstanceName = peerName; registerQuery.Context = cloudName; registerQuery.Blob = identityInfo; DeleteService(registerQuery); }
public PnrpRegisteredIdState enNameState; // state of registered name public static void ToPnrpInfoNative(PnrpInfo source, ref PnrpInfoNative target) { target.dwSize = source.dwSize; target.lpwszIdentity = source.lpwszIdentity; target.nMaxResolve = source.nMaxResolve; target.dwTimeout = source.dwTimeout; target.dwLifetime = source.dwLifetime; target.enResolveCriteria = source.enResolveCriteria; target.dwFlags = source.dwFlags; if (source.saHint != null) { target.saHint.lpSockAddr = source.saHint.lpSockAddr; target.saHint.iSockaddrLength = source.saHint.iSockaddrLength; } else { target.saHint.lpSockAddr = IntPtr.Zero; target.saHint.iSockaddrLength = 0; } target.enNameState = source.enNameState; }