我需要一个有效的VMCI套接字示例,它可以执行UDP所做的工作,但不需要联网。 vmci_sockets.h代码中有许多好的代码片段,但没有一个完整的工作模板可以扩展。
我认为服务器应如下所示:
#include "vmci_sockets.h"
#define BUFSIZE 2048
int main() {
int afVMCI = VMCISock_GetAFValue();
if ((sockfd_dgram = socket(afVMCI, SOCK_DGRAM, 0)) == -1) {
perror("socket");
goto exit;
}
struct sockaddr_vm my_addr = {0};
my_addr.svm_family = afVMCI;
my_addr.svm_cid = VMADDR_CID_ANY;
my_addr.svm_port = VMADDR_PORT_ANY;
if (bind(sockfd, (struct sockaddr *) &my_addr, sizeof my_addr) == -1) {
perror("bind");
goto close;
}
if (getsockname(sockfd, (struct sockaddr *) &my_addr, &svm_size) == -1) {
perror("getsockname");
goto close;
}
if ((numbytes = recvfrom(sockfd, buf, sizeof buf, 0,
(struct sockaddr *) &their_addr, &svm_size)) == -1) {
perror("recvfrom");
goto close;
}
close:
return close(sockfd);
}
和客户
#include <stdio.h>
#include <string.h>
#include "vmci_sockets.h"
#define BUFSIZE 128
int main() {
int afVMCI = VMCISock_GetAFValue();
int fd;
struct sockaddr_vm addr;
if ((fd = socket(afVMCI, SOCK_DGRAM, 0)) == -1) {
perror("socket");
return 1;
}
addr.svm_family = afVMCI;
addr.svm_cid = VMADDR_CID_ANY;
addr.svm_port = VMADDR_PORT_ANY;
bind(fd, (struct sockaddr *) &addr, sizeof addr);
struct sockaddr_vm serveraddr;
socklen_t svm_size = sizeof serveraddr;
{
int numbytes; char buf[BUFSIZE]; bzero(buf, BUFSIZE);
strcpy(buf, "hello there\n");
if ((numbytes = sendto(fd, buf, BUFSIZE, 0,
(const struct sockaddr *) &serveraddr, svm_size)) == -1) {
perror("sendto error");
goto close;
}
}
close:
close(fd);
VMCISock_ReleaseAFValueFd(fd);
return 0;
}
然而,它不起作用。没有太多文档,例如,如何排除故障。没有信息是否可以在同一个虚拟机中同时尝试服务器和客户端以进行调试。
我试图发布到vmware板,发送电子邮件给他们的支持,但似乎没有人有一个有效的例子。因为这不是标准的socketry,虽然它是类似的socketry,它是,并且是不可跟随的。
任何人都有一个有效的例子吗?
答案 0 :(得分:0)
我一直在与我们的开发团队进行内部检查 如果是这样的话,您的请求只会产生兴趣 vSphere失败的情况。我的最后评论是 我们从来没有打算正式支持VMware Fusion和 某些依赖项仅在内部引用上。
不幸的是,我们没有任何这样的vmci示例 在涉及VMware Fusion时公开分享。