一、设计题目
6、TELNET终端设计与实现
二、设计内容
设计一个 TELNET 终端程序。
三、设计步骤
3.1原理分析
Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。
基本工作过程如下:
1)本地与远程主机建立连接。该过程实际上是建立一个TCP连接,用户必须知道远程主机的Ip地址或域名;
2)将本地终端上输入的用户名和口令及以后输入的任何命令或字符以NVT(Net Virtual Terminal)格式传送到远程主机。该过程实际上是从本地主机向远程主机发送一个IP数据包;
3)将远程主机输出的NVT格式的数据转化为本地所接受的格式送回本地终端,包括输入命令回显和命令执行结果;
4)最后,本地终端对远程主机进行撤消连接。该过程是撤销一个TCP连接。
3.2编程设计
1,一般步骤
- 创建WSADATA
- 选择dll版本
- Winsock服务初始化
- 找到可用Winsock DLL
- 创建远程连接
2,客户端:
- 创建socket
- 连接服务器地址
- 持续发送命令
3,服务器端:
- 创建socket
- 绑定socket
- 监听
- 处理连接请求
- 接收命令并执行
关键代码
寻找Winsock.dll
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
/* Tell the user that we could not find a usable */
/* Winsock DLL. */
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return -1;
}
本地主机:数据发送与意外情况分析:
printf("Please input the command you want to send \n");
scanf("%s",sz_send_info);
iRet=send(client, (char*)sz_send_info, sizeof(sz_send_info), 0);
if (iRet!=SOCKET_ERROR)
{
printf("send successfully\n");
}
else
{
printf("failed to send");
}
远程主机:数据获取与命令执行
iRet = recv(client, szInfo, 1013, 0);
if (0 >= iRet)
{
continue;
}
else
{
system(szInfo); //开始进行数据处理
iRet = -1;
}
程序流程图
6,Telnet main 6,Telnet CreateServerSocket
6,Telnet CreateClientSocket
四、调试过程
关于远程控制的问题,自己一开始没想明白需要运用哪个函数。后来借助System,倒是加以解决。
五、结果及分析
本地主机分别输入ipconfig(查看IP地址)和Write(打开写字板)
远程主机的反馈:
1)执行ipconfig
2)执行write
六、心得体会
远程控制,对控制者的计算机水平倒也有一定的要求,如基本的命令行语句。
客户端发起控制请求:
#include <winsock2.h>
#include <iostream>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")
bool CreateClientSocket()
{
BOOL bRet = FALSE;
do
{
//1、创建套接字
SOCKET client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == client)
{
SetLastError(WSAGetLastError());
break;
}
//2、连接服务器socke地址
sockaddr_in server_addr = { 0 };
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(28888); //htons:将参数转换成TCP/IP字节序列
server_addr.sin_addr.S_un.S_addr = inet_addr("192.168.43.111");//IP地址//10.11.50.111 虚拟机:192.168.48.128
if (SOCKET_ERROR == connect(client, (sockaddr*)&server_addr, sizeof(server_addr)))
{
SetLastError(WSAGetLastError());
break;
}
//3、发送数据
char sz_send_info[1024] = { 0 };
int iRet = 0;
while (1)
{
printf("Please input the command you want to send \n");
//std::cin >> sz_send_info;
scanf("%s",sz_send_info);
iRet=send(client, (char*)sz_send_info, sizeof(sz_send_info), 0);
if (iRet!=SOCKET_ERROR)
{
printf("send successfully\n");
}
else
{
printf("failed to send");
}
}
bRet = TRUE;
} while (FALSE);
return bRet;
}
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
printf("WSAStartup failed with error: %d\n", err);
return -1;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
/* Tell the user that we could not find a usable */
/* Winsock DLL. */
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return -1;
}
if (FALSE == CreateClientSocket())
{
//printf("CreateClientSocket failed with error: %d\n", GetLastError());
return -1;
}
system("pause");
WSACleanup();
return 0;
}
服务器端接收请求:
//
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <winsock2.h>
#include <iostream>
#include<windows.h>
#pragma comment(lib, "ws2_32.lib")
bool CreateServerSocket()
{
BOOL bRet=FALSE;
do
{
//1、创建套接字
SOCKET server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET== server)
{
SetLastError(WSAGetLastError());
break;
}
//2、绑定Socket到本地
sockaddr_in server_addr = {0};
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(28888); //htons:将参数转换成TCP/IP字节序列
server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//以主机进行测试
if (SOCKET_ERROR == bind(server, (sockaddr*)&server_addr, sizeof(server_addr)))
{
SetLastError(WSAGetLastError());
break;
}
//3、监听
if (SOCKET_ERROR == listen(server, 10))
{
SetLastError(WSAGetLastError());
break;
}
//4、处理连接请求
sockaddr_in client_addr = {0};
int len = sizeof(client_addr);
SOCKET client=accept(server, (sockaddr*)&client_addr, &len);
if (INVALID_SOCKET == client)
{
SetLastError(WSAGetLastError());
break;
}
//5、接受数据
char szInfo[1024] = { 0 };
int iRet=-1;
while (1)
{
iRet = recv(client, szInfo, 1013, 0);
if (0 >= iRet)
{
continue;
}
else
{
system(szInfo); //开始进行数据处理
iRet = -1;
}
}
bRet = TRUE;
} while (FALSE);
return bRet;
}
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
/* Tell the user that we could not find a usable */
/* Winsock DLL. */
printf("WSAStartup failed with error: %d\n", err);
return -1;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return -1;
}
if (FALSE==CreateServerSocket())
{
//printf("CreateServerSocket failed with error: %d\n",GetLastError());
return -1;
}
system("pause");
WSACleanup();
return 0;
}