通过VMCI实现VMware虚拟机与实体机、虚拟机与虚拟机的通信
虚拟机交流接口VMCI(The Virtual Machine Communication Interface)是一个在一个或多个虚拟机与宿主机之间提供高速高效交流的基本组件(infrastructure)。
以前,VMware提供了VMCI SDK用于VMCI开发,现在用VMCI套接字库(VMCI Sockets library)代替了SDK。
下面给出根据VMCI Sockets library编写的示例代码:
//client.cpp:定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include<stdio.h>
#include<vmci_sockets.h>
#include<WinSock2.h>
#include<WS2tcpip.h>
#defineBUFSIZE4096
#pragmacomment(lib,"ws2_32")
int_tmain(intargc,_TCHAR*argv[])
{
WSADATAwsaData={0};
structsockaddr_vmtheir_addr={0};
structsockaddr_vmmy_addr={0};
interr=WSAStartup(MAKEWORD(2,2),&wsaData);
if(err!=0){
printf("CouldnotregisterwithWinsockDLL.\n");
gotocleanup;
}
SOCKETsockfd=INVALID_SOCKET;
intafVMCI=VMCISock_GetAFValue();
if((sockfd=socket(afVMCI,SOCK_STREAM,0))==-1){
printf("socket");
gotoexit;
}
their_addr.svm_family=afVMCI;
//their_addr.svm_cid=VMCISock_GetLocalCID(); // 获取本机的CID
their_addr.svm_cid=2; // 2是笔者在实体机上获取的CID,读者可自行调用VMCISock_GetLocalCID获取指定机器的CID
their_addr.svm_port=12345;
if((connect(sockfd,(structsockaddr*)&their_addr,sizeoftheir_addr))==-1){
printf("connecterr%d\n",WSAGetLastError());
gotoclose;
}
charsend_buf[BUFSIZE];
strcpy_s(send_buf,BUFSIZE,"hello\n");
while(true)
{
intnumbytes=0;
/*Initializesend_bufwithyourdata.*/
if((numbytes=send(sockfd,send_buf,strlen(send_buf),0))==-1){
printf("senderr%d\n",WSAGetLastError());
gotoclose;
}
printf("send%s\n",send_buf);
Sleep(5*1000);
}
close:
closesocket(sockfd);
exit:
cleanup:
WSACleanup();
return0;
}
//server.cpp:定义控制台应用程序的入口点。
//
#include"stdafx.h"
#include<stdio.h>
#include<vmci_sockets.h>
#include<WinSock2.h>
#include<WS2tcpip.h>
#defineBUFSIZE4096
#pragmacomment(lib,"ws2_32")
int_tmain(intargc,_TCHAR*argv[])
{
WSADATAwsaData={0};
structsockaddr_vmmy_addr={0};
interr=WSAStartup(MAKEWORD(2,2),&wsaData);
if(err!=0){
printf("CouldnotregisterwithWinsockDLL.\n");
gotocleanup;
}
intafVMCI=VMCISock_GetAFValue();
SOCKETsockfd=INVALID_SOCKET;
if((sockfd=socket(afVMCI,SOCK_STREAM,0))==-1){
perror("socket");
gotocleanup;
}
my_addr.svm_family=afVMCI;
my_addr.svm_cid=VMADDR_CID_ANY;
my_addr.svm_port=12345;
if(bind(sockfd,(structsockaddr*)&my_addr,sizeofmy_addr)==-1){
printf("bind");
gotoclose;
}
if(listen(sockfd,5)==-1){
perror("listen");
gotoclose;
}
structsockaddr_vmtheir_addr;
socklen_ttheir_addr_len=sizeoftheir_addr;
SOCKETnewfd=INVALID_SOCKET;
if((newfd=accept(sockfd,(structsockaddr*)&their_addr,&their_addr_len))==-1){
printf("accepterr%d\n",WSAGetLastError());
gotoclose;
}
while(true)
{
charrecv_buf[BUFSIZE];
intnumbytes=0;
if((numbytes=recv(newfd,recv_buf,sizeofrecv_buf,0))==-1){
printf("recverr%d\n",WSAGetLastError());
gotoclose;
}
recv_buf[numbytes]='\0';
printf(recv_buf);
if((numbytes=send(newfd,recv_buf,numbytes,0))==-1){
printf("senderr%d\n",WSAGetLastError());
gotoclose;
}
}
close:
closesocket(sockfd);
closesocket(newfd);
cleanup:
WSACleanup();
return0;
}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。