R socketConnection / make.socket (): есть ли способ продолжать прослушивание ()?

#sockets #r

#сокеты #r

Вопрос:

[Отказ от ответственности: мои знания о сокетах очень устарели, и я только начинаю изучать R, поэтому, если я пропустил что-то совершенно очевидное, пожалуйста, укажите на это!]

Если я понимаю (скудно документированные) функции R для создания сокетов и управления ими, а именно socketConnection и make.socket , то получается, что при создании серверного сокета ( server=TRUE ) выполняется моральный эквивалент следующего:

 s = socket(yada yada);
listen(s, ...);
s2 = accept(s, ...);
close(s, ...);
  

и теперь я могу работать с s2 , но не могу выполнить цикл, чтобы справиться с накопившимися входящими подключениями к s . Это более или менее правильно? Есть ли какой-либо способ продолжить прослушивание и продолжить обработку дополнительных входящих подключений после обработки первого?

Комментарии:

1. Вы когда-нибудь с этим разобрались?

Ответ №1:

Я бы тоже хотел знать ответ на этот вопрос! …но в то же время я могу, по крайней мере, предложить обходной путь с некоторыми ограничениями:

Если вы можете знать, СКОЛЬКО клиентов подключится, то должно сработать следующее.

На сервере:

 n=2         # Number of clients
port=22131

slist=vector('list',n)
# Connect to all clients
for(i in 1:n) slist[i] <- socketConnection('localhost', port=port, server=TRUE)

# Wait for a client to send data, returns the client index 
repeat {
  avail <- which( socketSelect(slist) )[[1]]
  # ...then read and process data, rinse, repeat...
}
  

На каждом клиенте:

 port=22131
# Connect to server
s <- socketConnection('localhost', port=port)
# ...then send data...
writeLines(c('foo', 'bar'), s)
  

Комментарии:

1. Спасибо за идею! К сожалению, я не знаю заранее, сколько клиентов может подключаться одновременно, хотя я могу адаптировать ваш код для повторного подключения в «пуле сокетов», который может поддерживать до N клиентов одновременно.

Ответ №2:

Нет, вы можете нажать кнопку обратного входа s1 .


Окно 1:

 $ R
s1 = socketConnection(server=T,port=12345)
s2 = socketConnection(server=T, port=98765)
  

Окно 2:

 $ nc localhost 12345
If ever I should leave you, it wouldn't be in springtime
Knowing how in spring I'm bewitched by you so
oh no not in springtime, summer, winter, or fall
no never could I leave you at all
  

Окно 3:

 $ nc localhost 98765
for Hitler and Germany
Deutschland is happy and gay
we're marching to a faster pace
look out, here comes the Master Race!
  

Окно 1:

 readLines(s1,1)
# "if ever I should leave you, it wouldn't be in springtime"
readLines(s2,1)
# "for Hitler and Germany"
readLines(s1,1)
# "knowing how in spring I'm bewitched by you so"
  

Комментарии:

1. обратная связь… вы хотите сказать, что это неправильно? Или просто не нравится мой вкус в музыкальном театре?

2. Позвольте мне рассказать вам, почему отрицательный ответ: «Гитлер и Германия».. Почему вы не можете изменить это на что-то более приятное?

3. Для всех, кто продолжает отмечать это, пожалуйста, обратите внимание, что выше приведены тексты из «Springtime for Hitler» от «The Producers» /

4. Независимо от происхождения этого текста, он одобряет жестокий расизм и в любом случае абсолютно не нужен для ответа на вопрос.