Я не знаю, какие виды сокет-вызовов без блокировки вы используете, но я бы порекомендовал использовать асинхронные вызовы (вместо Begin ).Для получения дополнительной информации о разнице между асинхронными вызовами и Begin см. В чем разница между BeginConnect и ConnectAsync?
Асинхронные вызовы автоматически выполняют "опрос" в ОСуровень, который будет намного эффективнее , чем ваш опрос.На самом деле они используют порты завершения ввода-вывода, которые, вероятно, являются самой быстрой и эффективной из тех, которые вы можете использовать в Windows для обработки большого количества клиентских подключений / запросов.
Что касается ошибки, ябудет считать, что это нормальная операция неблокирующих сокетов, поэтому вам просто нужно изящно с ней справиться.
Обновление
Ваш сервер, вероятно, должен сделать что-то вроде этого:
// Process the accept for the socket listener.
private void ProcessAccept(SocketAsyncEventArgs e)
{
Socket s = e.AcceptSocket;
if (s.Connected)
{
try
{
SocketAsyncEventArgs readEventArgs = this.readWritePool.Pop();
if (readEventArgs != null)
{
// Get the socket for the accepted client connection and put it into the
// ReadEventArg object user token.
readEventArgs.UserToken = new Token(s, this.bufferSize);
Interlocked.Increment(ref this.numConnectedSockets);
Console.WriteLine("Client connection accepted.
There are {0} clients connected to the server",
this.numConnectedSockets);
if (!s.ReceiveAsync(readEventArgs))
{
this.ProcessReceive(readEventArgs);
}
}
else
{
Console.WriteLine("There are no more available sockets to allocate.");
}
}
catch (SocketException ex)
{
Token token = e.UserToken as Token;
Console.WriteLine("Error when processing data received from {0}:\r\n{1}",
token.Connection.RemoteEndPoint, ex.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
// Accept the next connection request.
this.StartAccept(e);
}
}
Пример кода предоставлен проектом кода: http://www.codeproject.com/Articles/22918/How-To-Use-the-SocketAsyncEventArgs-Class