zoukankan      html  css  js  c++  java
  • Bridge网络模式下Linux虚拟机和主机进行通信

    我的VMware版本是8.0.3。其他版本的设置应该大致相同。

    1、注意我们的网络模式是Bridge

    image

    2、我们的网卡设置

    image

    image

    3、目标虚拟机(Linux)的IP

    image

    4、我的主机的IP地址

    image

    5、网络调试助手的设置

    image

    6、上一段用来调试网络的代码。这段代码使用UDP进行通信,主要的作用是应答式的,一回一答。

    #include <sys/types.h>  
    #include <sys/socket.h>  
    #include <arpa/inet.h>  
    #include <stdio.h>  
    #define BUFLEN 255  
      
    int main(int argc, char **argv)  
    {  
        struct sockaddr_in peeraddr, localaddr;  
        int sockfd;  
        char recmsg[BUFLEN+1];  
        int socklen, n;  
      
        if(argc!=5){  
            printf("%s <dest IP address> <dest port> <source IP address> <source port>\n", argv[0]);  
            exit(0);  
        }  
      
        sockfd = socket(AF_INET, SOCK_DGRAM, 0);  
        if(sockfd<0){  
            printf("socket creating err in udptalk\n");  
            exit(1);  
        }  
         printf("IP address Checking!\n");  
        socklen = sizeof(struct sockaddr_in);  
        memset(&peeraddr, 0, socklen);  
        peeraddr.sin_family=AF_INET;  
        peeraddr.sin_port=htons(atoi(argv[2]));  
        if(inet_pton(AF_INET, argv[1], &peeraddr.sin_addr)<=0){  
            printf("Wrong dest IP address!\n");  
            exit(0);  
        }  
        memset(&localaddr, 0, socklen);  
        localaddr.sin_family=AF_INET;  
        if(inet_pton(AF_INET, argv[3], &localaddr.sin_addr)<=0){  
            printf("Wrong source IP address!\n");  
            exit(0);  
        }  
        printf("try to bind local address \n");  
        localaddr.sin_port=htons(atoi(argv[4]));  
        if(bind(sockfd, &localaddr, socklen)<0){   
            printf("bind local address err in udptalk!\n");  
            exit(2);  
        }  
     printf("Please Type Some Message To Server\n");    
        if(fgets(recmsg, BUFLEN, stdin) == NULL) {
            printf("get nothing exit\n"); 
            exit(0);
        }  
     //    printf("end of fgets \n");  
        if(sendto(sockfd, "HELLO", strlen("HELLO"), 0, &peeraddr, socklen)<0){  
            printf("sendto err in udptalk!\n");  
            exit(3);  
        }  
     printf("end of sendto \n");  
          printf("start of recv&send message loop!\n");  
        for(;;){  
            /*recv&send message loop*/  
            printf("Waiting For Message...!\n");  
            n = recvfrom(sockfd, recmsg, BUFLEN, 0, &peeraddr, &socklen);  
            if(n<0){  
                printf("recvfrom err in udptalk!\n");  
                exit(4);  
            }else{  
                recmsg[n]=0;  
                printf("peer:%s\n", recmsg);    
            }  
         printf("Please Type Some Message To Server\n");    
            if(fgets(recmsg, BUFLEN, stdin) == NULL) exit(0);  
            if(sendto(sockfd, recmsg, strlen(recmsg), 0, &peeraddr, socklen)<0){  
                printf("sendto err in udptalk!\n");  
                exit(3);  
            }  
        }  
    }

    下图是以上代码运行的实例

    其中./udptalk 192.168.41.24 2000 192.168.92.128 2000  是启动的命令。在应用这段代码的时候,把192.168.41.24替换成要接受消息的主机(destination)。第一个2000是目标端口。192.168.92.128是本机地址,第二个2000是发送端口。

    image

    注意事项:

    你要确保默认网关是有效的,不然虚拟机和主机的通信就会失败。比如说你的网关设的是局域网内的一台主机,但是跟局域网相连的网线又被你拔了,这时候,虚拟机和主机的通信就会失败。

    其实最好将虚拟机的所用的虚拟网卡的网关设成真实主机的地址,这样就不用再借助一台主机来充当网关。(如下图所示)

  • 相关阅读:
    ElementUi
    Vue插件
    Vue-cli
    Vue进阶
    Vue组件
    Vue生命期钩子
    Vue基础
    Vue介绍
    logging模块
    time模块
  • 原文地址:https://www.cnblogs.com/kissazi2/p/3136153.html
Copyright © 2011-2022 走看看