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