VM两个虚拟机之间的通讯测试

文章一 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!”,回车后如下:


至此,原计划测试的都已经测试成功了!!





猜你喜欢

转载自blog.csdn.net/mijichui2153/article/details/80922876