コード例 #1
0
ファイル: Xmpp.cs プロジェクト: soywiz/NodeNetAsync
		async private Task ConnectAsync(string User, string Password)
		{
			Socket = await TcpSocket.CreateAndConnectAsync("talk.google.com", 5222);
			bool Authenticated = false;
			while (true)
			{
				Console.WriteLine("--------------------------");
				await Socket.WriteAsync("<stream:stream to='gmail.com' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' version='1.0'>");
				//await Socket.ReadBytesAsync(138);

				Reader = XmlReader.Create(Socket.Stream, new XmlReaderSettings() { Async = true, ConformanceLevel = ConformanceLevel.Fragment });
				await Reader.ReadAsync(); await Reader.ReadAsync(); Reader = Reader.ReadSubtree(); await Reader.ReadAsync();

				var FeaturesXml = await WaitEndElementAsync("stream:features");
				var starttls = FeaturesXml.OuterXml.Contains("starttls");

				//Console.WriteLine("starttls: {0}", starttls);
				//Console.ReadKey();

				if (starttls)
				{
					await Socket.WriteAsync("<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'><required /></starttls>");
					await WaitEndElementAsync("proceed");
					await Socket.SecureSslAsync("gmail.com");
					Console.WriteLine("StartTLS");
				}
				else if (!Authenticated)
				{
					await Socket.WriteAsync(String.Format("<auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>{0}</auth>", Convert.ToBase64String(Encoding.Default.GetBytes(String.Format("\0{0}\0{1}", User, Password)))));
					await WaitEndElementAsync("success");
					Authenticated = true;
				}
				else
				{
					await Socket.WriteAsync(String.Format("<iq xmlns='jabber:client' type='set' id='1'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><resource>{0}</resource></bind></iq>", "NodeNet"));
					var IqNode = await WaitEndElementAsync("iq");
					Console.WriteLine(IqNode.OuterXml);
					Console.ReadKey();
					return;
				}
			}
		}