欢迎转载,转载请保留原文链接:http://blog.csdn.net/mikulee/article/details/40150791
上一篇文章实现了被动式Telnet的后台端口数据转接功能。
接着实现定制的telnet客户端。
首先下载netkit实现的telnet源码:http://ftp.de.debian.org/debian/pool/main/n/netkit-telnet/netkit-telnet_0.17.orig.tar.gz
里面包含telnet客户端及服务端的实现,而我们仅仅需要的是客户端的源码。
经过一些简单的提取与修复,telnet客户端即可编译及运行。下面我们将telnet客户端修改成监听某个端口,等待客户端请求,以便真正实现telnet通讯。
首先修改程序入口,以便接收监听的端口这个参数。
代码略过。。
接着修改netlink.cc文件,将netlink.cc中的connect注释掉,改成以下函数,并修改对应头文件。
<span style="font-size:14px;">int netlink::listenPort(int debug, int port) { struct sockaddr_in server_addr; struct sockaddr_in client_addr; if ((psocket = socket(AF_INET, SOCK_STREAM, 0)) == -1) { fprintf(stderr, "Socket Error\n"); return 0; } // fill in server address struct bzero(&server_addr, sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = htonl(INADDR_ANY); server_addr.sin_port = htons(port); int opt; //setsockopt(psocket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); if (bind(psocket, (struct sockaddr *) (&server_addr), sizeof(struct sockaddr)) == -1) { fprintf(stderr, "Bind error,no:%d\n",errno); exit(1); } if (listen(psocket, 1) == -1) { fprintf(stderr, "listen error\n"); exit(1); } fprintf(stderr, "waitting for connection...\n"); int sin_size= sizeof(struct sockaddr_in); if ((net = accept(psocket, (struct sockaddr *) (&client_addr),(socklen_t *)&sin_size)) == -1) { fprintf(stderr, "Accrpt error\n"); return 0; } printf("Server get connection from %s,clientfd=%d\n", (unsigned char *) inet_ntoa(client_addr.sin_addr), net); return 2; }</span>
该程序启动以后,就会监听port端口,等等arm主机的连接到来。
下面说下该被动式Telnet的使用方法:
假设你编译的上面修改的客户端叫做:telnetPassive,arm主机上的叫做telnetPipe。
首先,用控制台运行telnetPassive,假设监听的端口是12345
./telnetPassive 12345
上篇文章已经说过将telnetPipe作为arm主机开机启动运行了。这里就不再说。
接着,我们自己的应用程序可以时刻的检测者web服务器端,等有需求的时候,自己的应用程序就可以通过socket发送数据“ip=服务器ip&port=服务器端口12345”到端口10109(这个端口是程序里设定的,可以在代码里自己修改)。接着telnetPipe就会为你完成一切,建立telnet连接。通过soket发送数据,网上一大堆代码教程。可以去搜一下。
接着送上我的源码,欢迎下载:
https://github.com/cat9/PassiveTelnet