文章一 https://blog.csdn.net/mijichui2153/article/details/80918285 中成功安装两个虚拟机,而且他们之间可以互ping。
文章二 https://blog.csdn.net/mijichui2153/article/details/80918813 中用两个xshell终端实现对init0、init1两个虚拟机的远程控制。
接下来对两个虚拟机之间再进行简易telnet、server/client等通讯测试。接下来进入正文:
第零步:前期配置
1、两个虚拟机init0和init1共享的VM配置如下:
2、init0的网卡配置(配置方法参见文章一)
3、init1的网卡配置(配置方法参见文章一)
其他的应该也没啥了,xshell和虚拟机的互联参见文章二。
第一步:telnet远程登录测试
1、开启两个xshell终端分别连接init0和init1,如下可知init0和init1的根目录是不同的。
2、在init1中输入 telnet 172.25.10.111 、然后输入登录名和登录密码后即成功登录到init0。
观察其跟目录,确实是init0的根目录。至此telnet远程登录测试结束。
期间可能遇到的问题:
问题一:telnet:connect to address IP地址: No route to host 这很大程度是因init0防火墙的原因,需要关闭。在init0中粗暴的直接执行“iptables -F"来关闭其防火墙。另外在此操作的时候可能还会遇到“permission denied”或者“权限不够”这时需要修改iptables的权限。(iptables是linux下的防火墙组件服务,外在表现就是一个文件)。进入提示路径然后修改其权限,指令是“chmod -R 777 iptable”。
第二步:server/client测试
0、测试程序来自 http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html#commentform
服务端程序:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>
#define MYPORT 8887
#define QUEUE 20
#define BUFFER_SIZE 1024
int main()
{
///定义sockfd
int server_sockfd = socket(AF_INET,SOCK_STREAM, 0);
///定义sockaddr_in
struct sockaddr_in server_sockaddr;
server_sockaddr.sin_family = AF_INET;
server_sockaddr.sin_port = htons(MYPORT);
server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
///bind,成功返回0,出错返回-1
if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)
{
perror("bind");
exit(1);
}
///listen,成功返回0,出错返回-1
if(listen(server_sockfd,QUEUE) == -1)
{
perror("listen");
exit(1);
}
///客户端套接字
char buffer[BUFFER_SIZE];
struct sockaddr_in client_addr;
socklen_t length = sizeof(client_addr);
///成功返回非负描述字,出错返回-1
int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);
if(conn<0)
{
perror("connect");
exit(1);
}
while(1)
{
memset(buffer,0,sizeof(buffer));
int len = recv(conn, buffer, sizeof(buffer),0);
if(strcmp(buffer,"exit\n")==0)
break;
fputs(buffer, stdout);
send(conn, buffer, len, 0);
}
close(conn);
close(server_sockfd);
return 0;
}
客户端程序:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>
#define MYPORT 8887
#define BUFFER_SIZE 1024
int main()
{
///定义sockfd
int sock_cli = socket(AF_INET,SOCK_STREAM, 0);
///定义sockaddr_in
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(MYPORT); ///服务器端口
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); ///服务器ip
///连接服务器,成功返回0,错误返回-1
if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
perror("connect");
exit(1);
}
char sendbuf[BUFFER_SIZE];
char recvbuf[BUFFER_SIZE];
while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
{
send(sock_cli, sendbuf, strlen(sendbuf),0); ///发送
if(strcmp(sendbuf,"exit\n")==0)
break;
recv(sock_cli, recvbuf, sizeof(recvbuf),0); ///接收
fputs(recvbuf, stdout);
memset(sendbuf, 0, sizeof(sendbuf));
memset(recvbuf, 0, sizeof(recvbuf));
}
close(sock_cli);
return 0;
}
1、一台虚拟机的测试:
你可以用xshell连接一个虚拟机然后开两个xshell连接模拟server算和client端测试通讯过程,此时就按照以上程序不需任何改动即可。
2、init0中运行server程序,在init1中用telnet与之通信。
(1)在init0中切换到共享文件夹,对server.cpp编译生成server可执行程序:g++ server.cpp -o server
(2)在init0中运行该服务程序:./server 如下所示:
(3)在init1中使用telnet与其建立连接和通信 。输入 telnet 172.25.10.111 8887 指令
然后输入字符串“nihao I am init!”如下图所示。
点击回车后如下:
由上图可知道init0收到了init1发过来的字符串并打印出来,并且还将这个字符串原样的返回给init1一份,init1也打印一份。
注:172.25.10.111是init0的IP地址;8887是server的端口号在server程序中指定。其实由文章一我们知道IP地址直接换成init0应该也是可以的。测试如下:
注:telnet的使用时可能被对方防火墙所禁止,处理方法签署不够的话可自行百度。
3、init0中运行server程序,在init1中运行client程序相互通信。
(1)首先我们要对客户端程序的IP地址做修改,此处肯定是修改成172.25.10.111.之后编译生成可执行文件client。
(2)先在init0运行server程序;再在init1中运行client程序。如下:
输入字符串“nihao! I am init1!”,回车后如下:
至此,原计划测试的都已经测试成功了!!