hostname lookup for telnet-proxy

This commit is contained in:
Sean Middleditch 2009-03-15 01:06:17 -04:00
parent d922c6f7e0
commit d88f1837a5
2 changed files with 28 additions and 18 deletions

15
README
View File

@ -287,17 +287,16 @@ If you do not have zlib installed and wish to disable MCCP2 support
then you must first edit the Makefile and remove the -DHAVE_ZLIB and
the -lz from the compile flags.
To run telnet-proxy, you simply give it the server's IP address
(telnet-proxy does not support hostname resolution, nor IPv6), the
server's port number, and the port number that telnet-proxy should
listen on. For example, to connect to the server on 209.85.171.100
port 7800 and to listen on port 5000, run:
To run telnet-proxy, you simply give it the server's host name or
IP address, the server's port number, and the port number that
telnet-proxy should listen on. For example, to connect to the server
on mud.example.com port 7800 and to listen on port 5000, run:
$ ./telnet-proxy 209.85.171.100 7800 5000
$ ./telnet-proxy mud.example.com 7800 5000
You can then connect to the host telnet-proxy is running on (e.g.
127.0.0.1, or the machine's public IP) on port 500 and you will
automatically be proxied into 209.85.171.100.
127.0.0.1) on port 500 and you will automatically be proxied into
mud.example.com.
telnet-proxy will display status information about the data
passing through both ends of the tunnel. Once either end

View File

@ -12,6 +12,7 @@
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <poll.h>
#include <errno.h>
#include <stdio.h>
@ -226,6 +227,8 @@ int main(int argc, char **argv) {
struct conn_t server;
struct conn_t client;
struct libtelnet_cb_t cb_table;
struct addrinfo *ai;
struct addrinfo hints;
/* check usage */
if (argc != 4) {
@ -255,7 +258,7 @@ int main(int argc, char **argv) {
}
/* wait for client */
if (listen(listen_sock, 5) == -1) {
if (listen(listen_sock, 1) == -1) {
fprintf(stderr, "listen() failed: %s\n", strerror(errno));
return 1;
}
@ -267,6 +270,16 @@ int main(int argc, char **argv) {
/* stop listening now that we have a client */
close(listen_sock);
/* look up server host */
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if ((rs = getaddrinfo(argv[1], argv[2], &hints, &ai)) != 0) {
fprintf(stderr, "getaddrinfo() failed for %s: %s\n", argv[1],
gai_strerror(rs));
return 1;
}
/* create server socket */
if ((server.sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
@ -274,25 +287,23 @@ int main(int argc, char **argv) {
return 1;
}
/* connect to server */
/* bind server socket */
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
if (bind(server.sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
fprintf(stderr, "bind() failed: %s\n", strerror(errno));
return 1;
}
memset(&addr, 0, sizeof(addr));
if (inet_pton(AF_INET, argv[1], &addr.sin_addr) != 1) {
fprintf(stderr, "inet_pton() failed: %s\n", strerror(errno));
return 1;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(strtol(argv[2], 0, 10));
if (connect(server.sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
/* connect */
if (connect(server.sock, ai->ai_addr, ai->ai_addrlen) == -1) {
fprintf(stderr, "server() failed: %s\n", strerror(errno));
return 1;
}
/* free address lookup info */
freeaddrinfo(ai);
/* initialize connection structs */
server.name = "\e[35mSERVER";
server.remote = &client;