2010-03-29 2 views
5

Я пишу пользовательский TCP-сервер и клиент и выполняя тонну запросов (точнее, 60 000). Я начинаю получать эту ошибку сокета 10048, которая should mean «адрес уже используется».Ошибка сокета 10048 на клиенте? Возможные причины?

Ошибка сохраняется, если я не приостанавливаю процесс примерно на 2 или 3 минуты, а затем снова запустите его, а затем он начнет повторять ту же ошибку через некоторое время после перезапуска. Если я приостанавливаю процесс клиента и перезапускаю серверный процесс, я все равно получаю ту же ошибку на клиенте. Таким образом, это полная проблема с клиентской стороной.

Это не имеет смысла, хотя эта ошибка возникает обычно при связывании, и эта ошибка возникает на клиенте, а не на сервере. Каковы могут быть возможные причины?

Небольшой отрывок из моей инициализации:

TcpClient client = new TcpClient(); 
client.Connect("XXXXX -- some ip", 25000); 
client.NoDelay = true; 
NetworkStream clientStream = client.GetStream(); 

Кроме того, все остальное, кажется, работает хорошо (в том числе и количество времени, которое требуется, чтобы отправить туда и обратно), и это прекрасно работает при использовании 127.0.0.1 но когда поместив его на другой компьютер локальной сети, я начинаю получать ошибку 10048.

Есть ли что-то не так с тем, как я его инициализирую? Что еще может вызвать эту ошибку на стороне клиента?

ответ

9

См. http://msdn.microsoft.com/en-us/library/e160993d%28v=VS.90%29.aspx SetSocketOption. Вам нужны DontLinger или ReuseAddr, или оба, я не уверен. В основном ваши сокеты застряли в состоянии TIME_WAIT некоторое время после того, как вы разорвите соединение TCP, как только вы их получите, вы не сможете создавать какие-либо новые клиентские соединения. Проверьте это с помощью вывода netstat -na.

Вы можете также сократить время, которое сокет остается в TIME_WAIT состоянии, изменяя его в реестре: http://msdn.microsoft.com/en-us/library/aa560610%28BTS.20%29.aspx По умолчанию 4 минуты, которые, вероятно, могут быть уменьшены до 1 или 2 минуты безопасно, особенно для тестирования.

Отказ от ответственности: Я не являюсь гуру TCP любыми способами.

+0

Я добавил 'client.LingerState = новый LingerOption (ложь, 0);' и использование NetStat, ваше право, у меня есть дерьмо нагрузки соединений в TIME_WAIT – Earlz

+0

Я имею в виду, у меня все еще много TIME_WAIT после добавления бит 'LingerState' – Earlz

+0

ReuseAddr также не помогает. – Earlz

0

У вас заканчиваются клиентские порты?

http://www.gavaghan.org/blog/2010/02/17/tcpip-parameter-tuning-for-rapid-client-connections/

Возможным связанный с этим вопрос: Maximum number of concurrent connections on a single port (socket) of Server

+0

Если это причина, то как она работает нормально всякий раз, когда я использую localhost? – Earlz

+1

@Earlz: Возможно, потому что соединения на 127.0.0.1 используют очень низкое (0?) Максимальное время жизни сегмента, так как мы действительно не можем получить блуждающие пакеты. Я не смог найти что-либо по этому поводу в googling, но это имело бы смысл. Вы можете попробовать и использовать IP-интерфейс и посмотреть, делает ли это его воспроизводимость на локальной машине, хотя это также может быть оптимизировано. Также посмотрите на настройку TcpTimedWaitDelay на 30 секунд (http://msdn.microsoft.com/en-us/library/ms819739.aspx) на сервере, если это возможно –

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