2016-02-20 2 views
2

У меня возникла довольно странная проблема. Я создал сервер сокетов unix между ruby ​​и C, где на стороне C основной поток создает и прослушивает сокет и, после принятия или соединения, позволяет потоку (из пула потоков) выполнять чтение и обработку информация.Ошибка чтения элемента дважды в том же соединении сокета unix

Я вижу, что всякий раз, когда у меня высокая нагрузка, мой accept() принимает 2 или 3 раза такое же соединение. Обычно это сопровождается тем, что клиент набрасывает мне сообщение «сломанная труба» в соединении, которое должно быть отправлено.

Например:

клиент:

Sending 1 
Sending 2 
Sending 3 
Error is Broken pipe 
Sending 4 
Sending 5 
... 

сервер:

New connection is 1 
New connection is 2 
New connection is 2 <<<< this should not be here! 
New connection is 4 
New connection is 5 
New connection is 6 

Мой код (++ код, сервер C)

//(... create the socket with standard socket, bind and listen calls) 
while(1) { 
     // Wait for connection 
     int connection = accept(streamSocket, (struct sockaddr *) &clientAddress, &clilen); 
     if (connection < 0){ 
      LOG(ERROR) << "Failed to accept new client socket connection, request index = " << requests; 
      break; 
     } 
     else 
      printf("New connection is %d\n", connection); 

     // Add connection to handler thread in pool 
     pool.AddJob([this, connection, requests, streamSocket]() { 
      char buffer[BUFFER_SIZE]; 
      bzero(buffer, BUFFER_SIZE); 
      int n = read(connection, buffer, BUFFER_SIZE-1); 

      //(... processing of the info) 
     } 
     close(connection); 
     }); 
    } 

И на стороне клиента в ruby (запустить в цикле):

request = "whatever json" 
for count in 1..10 
    begin 
    puts "Sending #{count}" 
    socket = UNIXSocket.new("/tmp/mysocket.socket") 
    socket.puts(request) 
    response = socket.read 
    socket.close 
    rescue Exception => e 
    puts "Error is #{e}" 
    end 
end 

Update

меня видеть, что использование socket.send или socket.write вместо socket.puts я не получаю никаких «сломанной трубы» ошибки, и поэтому нет повторен принимает в С стороны. Тем не менее, я проверил онлайн, и единственная (aparent) разница между ними кажется, что socket.puts добавляет новую строку в конце сообщения. Я хотел бы знать, почему puts не работает и какой (отправить или написать) рекомендуется.

ответ

0
New connection is 2 
<--- You probably have closed connection 2 here. Double check your code 
New connection is 2 <<<< this should not be here! 

Когда клиент пишет в связи с чем было закрыто сервером, это вызовет Broken pipe сигнал.

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