虚拟机交流接口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;

}