Ошибка чтения элемента дважды в одном соединении с сокетом 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

Мой код (код 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

Обновить

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

2

Решение

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 сигнал.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]