У меня возникла проблема с слишком большим количеством подключений. После нескольких тестов я пришел к выводу, что проблема связана с МОЙ сервер. Тот факт, что порт прослушивания сервера находился слева, должен был сказать мне.
При запуске одного и того же клиентского кода с использованием сервера на другом компьютере у меня не открываются сотни портов. Когда мой сервер на моей локальной машине, я получаю> 200 подключений к моему прослушивающему порту. Мне кажется, я неправильно работаю с клиентами. Мой код ниже, весь несерверный и клиентский код удален.
{
TcpListener server = null;
server = new TcpListener(port);
server.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
server.Start();
while (true)
{
var client = server.AcceptTcpClient();
using(var stream = client.GetStream()) {
...
stream.Read(...
...
stream.Write(...
} //using above should close this.
client.Close();
}
server.Stop();
}
Я изменил код, чтобы использовать асинхронные соединения, и он блокируется во второй раз, когда он выполняет потоковую передачу. Читайте только во время (client.Connected)
server = new TcpListener(port);
server.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
server.Start();
server.BeginAcceptTcpClient(new AsyncCallback(DoAcceptTcpClientCallback), server);
while (true)
Thread.Sleep(1000); //infinite loop for testing
public void DoAcceptTcpClientCallback(IAsyncResult ar)
{
Byte[] bytes = new Byte[1024 * 4];
TcpListener listener = (TcpListener)ar.AsyncState;
using (TcpClient client = listener.EndAcceptTcpClient(ar))
{
using (var stream = client.GetStream())
using (var ostream = new MemoryStream())
{
while (client.Connected)
{
int i;
while ((i = stream.Read(bytes, 0, bytes.Length)) == bytes.Length)
ostream.Write(bytes, 0, i);
ostream.Write(bytes, 0, i);
szresults = Func(ostream)
var obuf = Encoding.UTF8.GetBytes(szresults);
stream.Write(obuf, 0, obuf.Length);
}
}
client.Close();
}
}
NetworkStream.DataAvailable
- person bohdan_trotsenko   schedule 23.07.2010while (stream.Read(...) > 0)
вместо== bytes.Length
- person bohdan_trotsenko   schedule 23.07.2010.DataAvailalble == 0
следует... дождаться данных. В моем приложении я использовалThread.Sleep(20); ++counter;
, и если этот счетчик достигает 500, я завершаю соединение; но я согласен, что это может быть не лучший подход. - person bohdan_trotsenko   schedule 23.07.2010== bytes.Length
действительно ошибка.stream.Read()
возвращает количество прочитанных байтов. Если он возвращает 100, ваш циклwhile
завершается без записи этих байтов вostream
. - person bohdan_trotsenko   schedule 23.07.2010