From: Jams Date: 2012-05-29T06:47:36+09:00 Subject: Re: Where is tcpserver.c Included By socket.c? On May 28, 2012, at 3:07 PM 5/28/12, Brian Candler wrote: > James Harrison wrote in post #1062384: >> I did a quick search for socket.c and found documentation in there that >> references TCPServer.new, but which doesnt seem to have any >> implementation >> that would recognise the name TCPServer.new. > > Which Ruby are you looking at? In 1.8 it's pretty simple, the constant > TCPServer is defined in socket.c > > ruby-1.8.7-p352 $ grep -iR TCPServer ext/ > ext/socket/socket.c:VALUE rb_cTCPServer; > ext/socket/socket.c: * serv = TCPServer.new("127.0.0.1", 0) > ext/socket/socket.c: * tcpserver.accept_nonblock => tcpsocket > ext/socket/socket.c: * serv = TCPServer.new(2202) > ext/socket/socket.c: * to TCPServer#accept_nonblock fails. > ext/socket/socket.c: * TCPServer#accept_nonblock may raise any error > corresponding to accept(2) failure, > ext/socket/socket.c: * * TCPServer#accept > ext/socket/socket.c: * sock = TCPServer(addr, port) > ext/socket/socket.c: rb_cTCPServer = rb_define_class("TCPServer", > rb_cTCPSocket); > ext/socket/socket.c: rb_define_global_const("TCPserver", > rb_cTCPServer); > ext/socket/socket.c: rb_define_method(rb_cTCPServer, "accept", > tcp_accept, 0); > ext/socket/socket.c: rb_define_method(rb_cTCPServer, > "accept_nonblock", tcp_accept_nonblock, 0); > ext/socket/socket.c: rb_define_method(rb_cTCPServer, "sysaccept", > tcp_sysaccept, 0); > ext/socket/socket.c: rb_define_method(rb_cTCPServer, "initialize", > tcp_svr_init, -1); > ext/socket/socket.c: rb_define_method(rb_cTCPServer, "listen", > sock_listen, 1); > ext/tk/sample/tkextlib/tkHTML/page3/index.html: Tcl_OpenTcpServer
> I'm on 1.9.3. The same grep shows: wendigo:ruby james$ grep -iR TCPServer ext/ ext/openssl/ossl.c: * tcp_server = TCPServer.new 5000 ext/socket/.document:tcpserver.c ext/socket/basicsocket.c: * TCPServer.open("127.0.0.1", 15120) {|serv| ext/socket/basicsocket.c: * TCPServer.open("127.0.0.1", 1440) {|serv| ext/socket/basicsocket.c: * TCPServer.open("127.0.0.1", 1512) {|serv| ext/socket/basicsocket.c: * TCPServer.open("127.0.0.1", 1728) {|serv| ext/socket/basicsocket.c: * serv = TCPServer.new("127.0.0.1", 0) ext/socket/depend:tcpserver.o: tcpserver.c $(SOCK_HEADERS) ext/socket/extconf.rb: "tcpserver.#{$OBJEXT}", ext/socket/init.c:VALUE rb_cTCPServer; ext/socket/init.c: rsock_init_tcpserver(); ext/socket/rubysocket.h:extern VALUE rb_cTCPServer; ext/socket/rubysocket.h:void rsock_init_tcpserver(void); ext/socket/socket.c: * server = TCPServer.new 2000 # Server bound to port 2000 ext/socket/socket.c: * Socket.tcp_server_loop, TCPServer.open ext/socket/tcpserver.c: tcpserver.c - ext/socket/tcpserver.c: * TCPServer.new([hostname,] port) => tcpserver ext/socket/tcpserver.c: * serv = TCPServer.new("127.0.0.1", 28561) ext/socket/tcpserver.c: * tcpserver.accept => tcpsocket ext/socket/tcpserver.c: * TCPServer.open("127.0.0.1", 14641) {|serv| ext/socket/tcpserver.c: * tcpserver.accept_nonblock => tcpsocket ext/socket/tcpserver.c: * serv = TCPServer.new(2202) ext/socket/tcpserver.c: * to TCPServer#accept_nonblock fails. ext/socket/tcpserver.c: * TCPServer#accept_nonblock may raise any error corresponding to accept(2) failure, ext/socket/tcpserver.c: * * TCPServer#accept ext/socket/tcpserver.c: * tcpserver.sysaccept => file_descriptor ext/socket/tcpserver.c: * TCPServer.open("127.0.0.1", 28561) {|serv| ext/socket/tcpserver.c:rsock_init_tcpserver(void) ext/socket/tcpserver.c: * Document-class: TCPServer < TCPSocket ext/socket/tcpserver.c: * TCPServer represents a TCP/IP server socket. ext/socket/tcpserver.c: * server = TCPServer.new 2000 # Server bind to port 2000 ext/socket/tcpserver.c: * server = TCPServer.new 2000 ext/socket/tcpserver.c: rb_cTCPServer = rb_define_class("TCPServer", rb_cTCPSocket); ext/socket/tcpserver.c: rb_define_method(rb_cTCPServer, "accept", tcp_accept, 0); ext/socket/tcpserver.c: rb_define_method(rb_cTCPServer, "accept_nonblock", tcp_accept_nonblock, 0); ext/socket/tcpserver.c: rb_define_method(rb_cTCPServer, "sysaccept", tcp_sysaccept, 0); ext/socket/tcpserver.c: rb_define_method(rb_cTCPServer, "initialize", tcp_svr_init, -1); ext/socket/tcpserver.c: rb_define_method(rb_cTCPServer, "listen", rsock_sock_listen, 1); /* in socket.c */ ext/tk/sample/tkextlib/tkHTML/page3/index.html: Tcl_OpenTcpServer
I see two VALUE definitions: rb_cTCPServer in init.c, and an exern declaration of the same in rubysocket.h.