Ошибка «Сброс соединения по одноранговому узлу» произошла, когда новый TCP-сокет - PullRequest
3 голосов
/ 08 июля 2011

Приведенный ниже код предназначен для создания TCP-сервера и клиентов.Но когда число клиентских потоков слишком велико (например, 100 потоков), клиент получает ошибку «Сброс соединения по одноранговой сети».Я не могу найти причину ошибки, поэтому мне нужна ваша помощь.

Сервер:

#!/usr/bin/env ruby1.9
# -*- coding: utf-8 -*-

require "socket"
crab = TCPServer.new "127.0.0.1", 8087
while browser = crab.accept
  Thread.new browser do | client |
    puts client.gets
    client.puts "hello"
    client.close
  end
end

Клиент:

#!/usr/bin/env ruby1.9
# -*- coding: utf-8 -*-
require "socket"
threads_arr = []
ARGV[0].to_i.times do    
  t = Thread.new do
    client = TCPSocket.new "127.0.0.1", 8087
    client.puts "hello"
    client.gets
    client.close
  end  
  threads_arr << t
end
threads_arr.each do | t |
  t.join
end

Окружение:

Mac OS X 10.6.8

ruby ​​1.8.7p174 / ruby ​​1.9.2p180

Ответы [ 2 ]

3 голосов
/ 08 июля 2011

Было бы проще сделать в EventMachine ?Поток будет только масштабироваться до тех пор, пока он не станет причиной проблем.EventMachine также лучше обрабатывает загрузку при получении большого количества соединений.

Возможно, вам придется проверить, достаточно ли велика ваша очередь на прием.По умолчанию это что-то вроде 5 ожидающих соединений, и если они не могут быть подтверждены достаточно быстро, вы можете их отбросить.

0 голосов
/ 08 июля 2011

Разъем должен быть закрыт с одной стороны - или только клиент или только сервер.В вашем примере, если сервер закрывает соединение, первый клиент получает исключение при попытке закрыть соединение.
Удалите, например, close вызов в клиенте:

  t = Thread.new do
    client = TCPSocket.new "127.0.0.1", 8087
    client.puts "hello"
    client.gets
  end  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...