2014-01-07 5 views
-1

Я создал обертку поверх TcpClient для отправки SSL. Таким образом, для подключения я сделать это таким образом:Исключение en SSL-соединение

Stream _stream = null; 

TcpClient _tcpClient = new TcpClient(IPAddress.ToString(), Port); 

if (isSsl) 
{ 
    SslStream sslStream = new SslStream(_tcpClient.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate), new LocalCertificateSelectionCallback(SelectLocalCertificate)); 

    if (Certificate != null) 
    {        
     X509CertificateCollection cc = new X509CertificateCollection(); 
     cc.Add (Certificate); 
     sslStream.AuthenticateAsClient(_Host, cc, SslProtocols.Default, false); 
    } 
    else 
    { 
     sslStream.AuthenticateAsClient(_Host); 
    } 

    sslStream.WriteTimeout = 5000;       
    _stream = (SslStream)sslStream; 
} 
else 
{ 
    NetworkStream networkStream = _client.GetStream(); 
    _stream = (NetworkStream)networkStream; 
} 

Для отправки, я:

_stream.Write(dgram, 0, dgram.Length);  

Время от времени, у меня есть исключение с этим сообщением:

Исключение: Невозможно записать данные в транспортное соединение: попытка подключения завершилась неудачно, потому что связанная сторона не ответила должным образом через некоторое время или установив соединение не удалось, поскольку подключенный хост не смог ответить.

Внутреннее исключение: Попытка подключения не удалась, поскольку подключенная сторона не ответила после определенного периода времени, или установить соединение не удалось, так как подключенный хозяин не смог ответить

И StackTrace:

в System.Net.Sockets.NetworkStream.Write (буфер Byte [], смещение Int32, размер Int32) в System.Net.Security._SslStream.StartWriting (буфер Byte [], смещение Int32, количество Int32, AsyncProtocolRequest asyncRequest) в системе System.Net.Security ._SslStream.ProcessWrite (Byte [] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest) в System.Net.Security.SslStream.Write (байт [] buffer, Int32 offset, Int32 count) в MyCompany.Net.IGTcpClient. Отправить (сообщение String)

Я отправляю несколько сообщений в порядке и случайным образом, у меня есть это исключение. Теперь, когда я получаю это исключение, я закрываю соединение и снова открываю. Я могу отправлять сообщения с другого количества времени, пока исключение не возникнет снова.

Когда я закрываю соединение, я:

if (_stream != null) 
{ 
    _stream.Close(); 
} 
if (_tcpClient != null) 
{ 
    _tcpClient.Close(); 
} 

Я понятия не имею, почему. Любая идея о причине этого исключения?

Заранее спасибо

+0

Причиной исключения является _in_ исключение: _ «Не удалось выполнить попытку подключения, потому что связанная сторона не ответила должным образом через некоторое время или установив соединение не удалось, потому что подключенный хост не смог ответить« _. Убедитесь, что порт доступен и сокет прослушивает. – CodeCaster

+0

Да, порт доступен и сокет прослушивает. На самом деле, я отправляю несколько сообщений в порядке и случайным образом, у меня есть это исключение. Теперь я закрываю соединение и снова открываю. – J19

+0

Какую среду вы используете? Сколько ядер? Версия ОС/версия? IIS/IIS Express? Я замечаю, что вы не закрываете свои потоки, и в определенных конфигурациях у вас может быть только ограничение из трех одновременных потоков. – Aron

ответ

0

комментарий Арона является правильным, вам нужно закрыть эти потоки. Socket выходят на некоторое время после того, как они закрыты, и может быть, что серверная сторона уже считает, что у нее есть связь с вашим клиентом, когда на самом деле это не так. Закрытие потока после использования обеспечит хороший «открытый» в следующий раз.

ОБНОВЛЕНИЕ. Я достигаю, но увеличиваю время ожидания до десяти секунд (от пяти).

+0

Я обновил главный пост, чтобы отразить этот вопрос. спасибо – J19

Смежные вопросы