Я столкнулся с довольно странной проблемой. Я создал сервер сокетов 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 добавляет новую строку в конце сообщения. Я хотел бы знать, почему путы не работают и какой из них (отправить или написать) рекомендуется.