/* * call-seq: * socket.sysaccept => [client_socket_fd, client_sockaddr] * * Accepts an incoming connection returnings an array containg the (integer) * file descriptor for the incoming connection, _client_socket_fd_, * and a string that contains the +struct+ sockaddr information * about the caller, _client_sockaddr_. * * === Example * # 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 * * Refer to Socket#accept for the exceptions that may be thrown if the call * to _sysaccept_ fails. * * === See * * Socket#accept */ static VALUE sock_sysaccept(sock) VALUE sock; { OpenFile *fptr; VALUE sock2; char buf[1024]; socklen_t len = sizeof buf; GetOpenFile(sock, fptr); sock2 = s_accept(0,fileno(fptr->f),(struct sockaddr*)buf,&len); return rb_assoc_new(sock2, rb_str_new(buf, len)); }