Where is tcpserver.c Included By socket.c?

Hey folks,

I was reading the source to GServer recently and saw that the start
method
creates a new TCPServer:

  @tcpServer = TCPServer.new(@host,@port)

I checked the includes and can see that there’s socket and thread
required.
Of these two, only socket contains references to TCP.

The requires for GServer are socket and thread, so I assumed this came
from
socket. I read socket.rb, though, and I didnt see a TCPServer
definition,
so I checked its requires: it requires socket.so.

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.

Socket.c includes rubyserver.h. Reading that, I saw these two lines:

extern VALUE rb_cTCPServer;

void rsock_init_tcpserver(void);

So were mentioning a tcpserver in an included library,.

From here, I didnt know where to go.I did a search of the source tree
for
tcpserver and found tcpserver.c. It also includes rubyserver.h, so
presumably somewhere in that include is where the relationship between
socket and tcpserver is created, but I cant see where.

Could anyone give me a pointer to how to find out the relationship
between
socket.c and tcpserver.c?

Thanks!

Jams

James H.on 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

On May 28, 2012, at 3:07 PM 5/28/12, Brian C. wrote:

ext/socket/socket.c:VALUE rb_cTCPServer;
ext/socket/socket.c: rb_define_global_const(“TCPserver”,
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.

On May 28, 2012, at 3:47 PM 5/28/12, Jams wrote:

TCPServer is defined in socket.c
ext/socket/socket.c: * sock = TCPServer(addr, port)
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

Oh! I see where I’m misthinking:

ext/socket/tcpserver.c: rb_cTCPServer = rb_define_class(“TCPServer”,
rb_cTCPSocket);

Perfect!

Thanks for the pointer, Brian.

Jams