On Mon, 26 Jun 2000, Art Sackett wrote:
> Greetings, All:
>
> Please forgive me if this is documented somewhere -- a pointer to the
> documentation would be greatly appreciated!
>
> I've got a custom (just wrote it) standalone TCP/IP server daemon that listens
> on a high port and works fine servicing connections from localhost. However,
> when I try to connect (via telnet) from any other machine on the network, I
> get "connection refused". I tried editing /etc/hosts.allow so it contains the
> single line ALL:ALL and then /etc/init.d/netbase restart, to no avail.
> (Reverted back to what it used to be right after -- it's an internet-connected
> machine.)
>
NOTE: I have absolutely no idea what I'm talking about. This works for me. YMMV.
Are you binding to a specific IP address (eg, 127.0.0.1), or just 0.0.0.0?
If you bind to a specific IP, only packets coming in on that interface
will actually appear. I've written a small daemon which handles multiple
requests by forking; I do something like this:
listen = serve(port);
while( 1 ) {
request = getrequest(listen);
pid = fork();
if( pid == -1 ) exit_error("fork");
if( pid )
close(request);
else {
// Handle connection, reading and writing from/to request.
// Exit when done.
exit(0);
}
}
The getrequest function uses memset to clear the contents of the
sockaddr_in structure, thus initializing the address to 0.0.0.0 (and
setting the rest to sane values).
Ah, what the hell, I'll just list the whole function :P
int serve(unsigned short int port)
{
int client;
struct sockaddr_in client_addr;
int opt, val;
client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(client == -1) {
exiterr("socket create");
}
opt = 1;
val = setsockopt(client, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if( val == -1 ) {
exiterr("setsockopt reuseaddr");
}
#ifdef SO_REUSEPORT /* not def in Linux yet */
val = setsockopt(client, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));
if( val == -1 )
exiterr("setsockopt reuseport");
}
#endif
memset(&client_addr, 0, sizeof(client_addr));
client_addr.sin_family = AF_INET;
client_addr.sin_port = htons(port);
if(bind(client, (struct sockaddr *)&client_addr, sizeof(client_addr))) {
exiterr("socket create");
}
listen(client, 0);
return(client);
}
Immensely useful to me was the netcat source (almost as useful as the
netcat binary). Netcat does everything, so it's a good program to use for
hints.
Hopefully what I've included is useful, you can do whatever you'd like
with the code; it's not exactly a trade secret.
Questions, comments, flames, sister's phone numbers welcome.
-chet ([EMAIL PROTECTED])
> I know it has to be an easy, probably obvious, operation to get this port
> opened up, I just cannot find it. Any help anyone can provide would be
> appreciated.
>
> --
> ---- Art Sackett ----
>
>
> --
> To UNSUBSCRIBE, email to [EMAIL PROTECTED]
> with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]
>
>
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]