witam,
za zadanie mam zaimplementować funkcję do przesyłania (odbieranie i wysyłanie) stringów. Chodzi o to, że recv_msg dostaje na wejściu strumień i bufor i z niego odczytuje wiadomość w jakimś tam formacie, send_msg z kolei ma na wejściu strumień oraz wiadomość jaką ma w nim zapisać. Motywacja: “Chodzi o możliwość przesyłania przez połączenie tcp ciągu komunikatów, które są dowolnymi stringami złożonymi ze znaków unicode…”
Powiedzmy, że mamy taki kod:
def send_msg(stream, msg)
#tu sobie formatuje wiadomość
end
gdzie msg to string, natomiast stream to obiekt IO (twierdze tak, sadzac po tresci zadania :P)
i teraz, jak to zrobić w ruby?
Klasa IO ma metodę .new której jednym z argumentów jest intowy deskryptor. Niestety w dokumentacji przykładem deskryptora jest stderr które jest równe 2, nie ma przykładu, kiedy podajemy deskryptor gniazda, pliku etc. Ponieważ funkcje mają być przetestowane na plikach pomyślałem, że może klasa File ma jakąś metodę zwracającą deskryptor ale czegoś takiego nie znalazłem. (znalazłem cos jak sysopen w IO, ale niejestem pewien czy nadaje sie to do tego problemu)
Jakieś sugestie?
Mam nadzieje, że przedstawiłem swój problem w zrozumiały sposób… Jeśli nie to podeśle przykladowy kod napisany w TCL lub JAVA.
pozdr
[code=ruby] # In one script, start this first
require ‘socket’
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
sockaddr = Socket.pack_sockaddr_in( 2200, ‘localhost’ )
socket.bind( sockaddr )
socket.listen( 5 )
client_fd, client_sockaddr = socket.sysaccept
client_socket = Socket.for_fd( client_fd )
puts “The client said, ‘#{client_socket.readline.chomp}’”
client_socket.puts “Hello from script one!”
socket.close
# In another script, start this second
require 'socket'
include Socket::Constants
socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
socket.connect( sockaddr )
socket.puts "Hello from script 2."
puts "The server said, '#{socket.readline.chomp}'"
socket.close[/code]
no nie o to mi chodziło… mam to przetestować na plikach więc potrzebuje utworzyc plik, majac do niego uchwyt utworzyc “strumien”, który dopiero przekazuje do tych funkcji(recv_msg, send_msg). Za strumieniem może się kryć nie tylko plik (może być tez gniazdo lub np standardowe wejscie/wyjscie czyli klawiatura/monitor), ma to byc “uniwersalne”. Da sie tak zrobić w R.?
Inaczej: stream = IO.new(fd,“tryb”) teraz stream to strumien, czy pod fd da sie podstawic deskryptor pliku? Jesli tak, to jak go uzyskac??