我有一個奇怪的問題:我寫了一個基於.net2的服務器和客戶端,它們正在通過.net 2 SslStream聊天。有1個連接用於在Cl和S之間發送命令,以及一個用於在cl和s之間發送文件的連接。
本地所有在我的Windows機器上工作正常。但是,如果我在我的Linux服務器上運行服務器(使用單聲道),共享文件在某些情況下不起作用。我有不同的文件類別,第3箇中的2個工作,第3箇中的服務器掛在SSLStream.AuthenticateAsServer(....);
上,並且客戶端拋出異常,並顯示消息「對SSPI調用失敗,請參閱內部異常」。 Innerexception是一個System.ComponentModel.Win32Exception異常與消息「收到的消息是意外或格式不正確。」SSLStream:「調用SSPI失敗」異常
我認爲我在Linux上運行它的方式可能是錯誤的。其實我使用VS2012進行本地開發,當我想把它放在服務器上時,我使用mono server.exe
上傳VS和Im編譯的exe來啓動它。但我也嘗試在Windows上使用monodevelop來編譯它(從monodevelop編譯的東西也可以在本地工作)並在Linux服務器上使用它,但是這會以相同的結果結束。
任何幫助將不勝感激。
我的繼承人縮短代碼:
客戶:
//gets auth guid before, then it does
Thread Thre = new Thread(sendfile);
Thre.Start(authguid);
private void sendfile(string guid){
TcpClient cl = new TcpClient();
cl.Connect(hostname, 8789);
SslStream Stream = new SslStream(cl.GetStream(), true, new RemoteCertificateValidationCallback(ServerConnector.ValidateServerCertificate));
Stream.AuthenticateAsClient(hostname);//throws the exception
//sends auth guid and file
}
服務器:
public class FServer
{
protected static bool halt = false;
protected List<FConnection> connections;
private TcpListener tcpServer;
private IPEndPoint ipEnde = new IPEndPoint(IPAddress.Any, 8789);
private delegate void dlgAccept();
private dlgAccept accepting;
private IAsyncResult resAccept;
public FServer()
{
tcpServer = new TcpListener(ipEnde);
connections = new List<FConnection>();
tcpServer.Start();
accepting = new dlgAccept(accept);
resAccept = accepting.BeginInvoke(null, null);
}
public void accept()
{
do
{
if (tcpServer.Pending())
connections.Add(new FConnection(tcpServer.AcceptTcpClient(), this));
else
Thread.Sleep(750);
} while (!halt && tcpServer != null);
}
public class FConnection
{
public SslStream stream;
//.....some other properties
public static bool ValidateClientCertificate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
public FConnection(TcpClient cl, FServer inst)
{
instance = inst;
client = cl;
stream = new SslStream(client.GetStream(), false, new RemoteCertificateValidationCallback(ValidateClientCertificate), null);
stream.AuthenticateAsServer(instance.mainserver.serverCert, false, SslProtocols.Tls, false);//hangs sometimes on this
if (stream.IsAuthenticated && stream.IsEncrypted)
{
}
else
{
this.Dispose();
}
//auth and receiving file
}
}
}
爲什麼同樣的方法不爲我工作?即使上面提到的變化發生,我也會得到同樣的錯誤。 –
有人幫我嗎? –
嗨。我也有同樣的問題。即使你改變了這個問題也沒有修復。不知道有更多的信息? – virtouso