I am using SslClientStream to connect to jabber server. Both Read() and
StartRead() functions work good, except that StartRead() doesn't return
after starting async operation. Is it supposed to work this way or am I
doing something wrong?
Simple program that shows the problem is attached, it compiles with:
mcs -r:Mono.Security.dll -r:System.Security.dll Main.cs

-- 
Dominik Zablotny
xmpp://[EMAIL PROTECTED]
using System;
using System.Text;
using System.IO;
using System.Net.Sockets;
using Mono.Security.Protocol.Tls;
using Mono.Security.X509;
using System.Threading;

class MainClass
{

	const string hostname = "jabber.org.au";
	const string init =	"<?xml version=\"1.0\"?>\n"+
		"<stream:stream to=\""+hostname+"\" "+
		"xmlns=\"jabber:client\" xmlns:stream=\"http://etherx.jabber.org/streams\"; "+
		"version=\"1.0\">";
	const string starttls =
		"<starttls xmlns=\"urn:ietf:params:xml:ns:xmpp-tls\"/>";

	const int bufSize = 4096;
	static byte[] buf = new byte[bufSize];
	
	static SslClientStream sslStream;
	static Stream stream;

	// reads string from stream
	static string Read()
    {
		int x = stream.Read(buf, 0, bufSize);
		string s = Encoding.UTF8.GetString(buf, 0, x);
		Console.WriteLine("\nincoming:\n"+s);
		return s;		 
    }
    
    // writes string to stream
    static void Write(string s)
    {
    	stream.Write( Encoding.UTF8.GetBytes(s), 0,
    	              Encoding.UTF8.GetByteCount(s) );
		Console.WriteLine("\noutgoing:\n"+s);
    }

	private static bool CertificateValidation (System.Security.Cryptography.X509Certificates.X509Certificate certificate, int[] certificateErrors)
	{
	   	Console.WriteLine("CertificateValidation");		
		return true; // don't care, always accept
	}

    public static void DataReceived(IAsyncResult ar)
    {
        try {
            int bytes = stream.EndRead(ar);
	        Console.WriteLine("\nasync incoming:\n"+Encoding.UTF8.GetString(buf, 0, bytes));
        }    
        catch (Exception e) {
        	Console.WriteLine(e.ToString());
        }
    }
    
    public static void Main(string[] args)
	{
		Mono.Security.Protocol.Tls.SecurityProtocolType protocol = 
				Mono.Security.Protocol.Tls.SecurityProtocolType.Tls;
		System.Security.Cryptography.X509Certificates.X509CertificateCollection certificates =
			    new System.Security.Cryptography.X509Certificates.X509CertificateCollection ();
	
		TcpClient client = new TcpClient();
		client.Connect(hostname, 5222);
		stream = client.GetStream();

		// TLS negotiation
		Write(init); 
		if (Read().Length < 200) Read();	 
		Write(starttls);
		Read();
		
	   	Console.WriteLine("\nswitching to TlsClientStream\n");
		sslStream = new SslClientStream(stream,hostname, true, protocol,certificates);
		sslStream.ServerCertValidationDelegate += new CertificateValidationCallback (CertificateValidation);
		stream = sslStream;
		
		// uncommenting this forces server to return some data
		// Write(init); 
		
		// HERE IS THE PROBLEM
		Console.WriteLine("ping");
		try {
	    	sslStream.BeginRead(buf, 0, bufSize,
	            			new AsyncCallback(DataReceived), null );
		}
		catch (Exception e) {
			Console.WriteLine(e.ToString() );
		}
		Console.WriteLine("pong");
		System.Threading.Thread.Sleep(10000); // wait for async
	}
}
_______________________________________________
Mono-list maillist  -  Mono-list@lists.ximian.com
http://lists.ximian.com/mailman/listinfo/mono-list

Reply via email to