Ошибка чтения элемента дважды в одном и том же сокетном соединении unix

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

Я вижу, что всякий раз, когда у меня высокая нагрузка, мой 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

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

//(... 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

Обновить

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


person XAnguera    schedule 20.02.2016    source источник


Ответы (1)


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.

person Zang MingJie    schedule 25.04.2016