歡迎轉載,轉載請保留原文鏈接: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