当前位置: 技术问答>linux和unix
主机通过wifi上网无法收到虚拟机的广播或多播消息?有线上网就可以。
来源: 互联网 发布时间:2017-02-22
本文导语: 我的主机是win7,通过WIFI上网,用的是vmware8,在虚拟机linux系统里写了一个简单的UDP广播或多播程序,但主机收不到该广播消息, 若我换成有线上网,则主机能收到广播或多播消息。 不知道原因是什么? /**************...
我的主机是win7,通过WIFI上网,用的是vmware8,在虚拟机linux系统里写了一个简单的UDP广播或多播程序,但主机收不到该广播消息,
若我换成有线上网,则主机能收到广播或多播消息。
不知道原因是什么?
若我换成有线上网,则主机能收到广播或多播消息。
不知道原因是什么?
/**********************************************************************
* Compiler: GCC
* Last Update: Mon 14 May 2012 08:40:24 PM CST
* File Name: myServerMulticast2.c
* Description: 多播客户端
* Usage: myServerMulticast2 多播地址 [端口号(默认为PORT)]
************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#define MAXBUF 1024
#define PORT 60000
int main(int argc, char **argv)
{
int myFd;
struct sockaddr_in mCastAddr;
int addrlen = sizeof(mCastAddr);
char buf[MAXBUF];
bzero(&mCastAddr, sizeof(mCastAddr));
bzero(buf, sizeof(buf));
//创建套接字
if((myFd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
printf("socket()错误码:%d, %sn", errno, strerror(errno));
exit(errno);
}
mCastAddr.sin_family = AF_INET;
if (argc > 1) { //IP地址
int res;
if ((res = inet_pton(AF_INET, argv[1], &mCastAddr.sin_addr)) == -1) {
printf("inet_pton()错误码:%d, %sn", errno, strerror(errno));
exit(errno);
} else if(res == 0) {
printf("IP地址无效n");
printf("请输入一个多播地址:224.0.0.1 ~ 239.255.255.255n");
return 0;
}
} else {
printf("Usage: %s 多播IP地址n", argv[0]);
return 0;
}
if (argc == 3) {
mCastAddr.sin_port = htons(atoi(argv[2]));
} else {
mCastAddr.sin_port = htons(PORT);
}
while (1) {
bzero(buf, sizeof(buf));
printf("请输入要发送的消息:");
if (fgets(buf, sizeof(buf), stdin) == NULL) {
exit(0);
}
if (sendto(myFd, buf, strlen(buf) + 1, 0,
(struct sockaddr *)&mCastAddr, sizeof(mCastAddr)) == -1) {
printf("sendto()错误码:%d, %sn", errno, strerror(errno));
exit(errno);
}
printf("成功给对方发送消息:%s", buf);
}
return 0;
}
/**********************************************************************
* Compiler: GCC
* Last Update: Mon 14 May 2012 06:48:56 PM CST
* File Name: myClientMulticast2.c
* Description:
************************************************************************/
#include
#include
#include
#include
#include
#include
#include
#define _DEBUG
#define MAXBUF 1024
#define PORT 60000
int main(int argc, char **argv)
{
int myFd, clientFd;
struct sockaddr_in myAddr, clientAddr;
struct ip_mreq mreq;
int addrlen = sizeof(clientAddr);
char buf[MAXBUF];
char addrTemp[INET_ADDRSTRLEN];
bzero(&myAddr, sizeof(myAddr));
bzero(&clientAddr, sizeof(clientAddr));
//创建套接字,datagrams
if((myFd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
printf("%s Line number:%d socket()错误码:%d, %sn",
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
}
//设置本地地址端口信息
myAddr.sin_family = AF_INET;
myAddr.sin_addr.s_addr = INADDR_ANY;
if (argc == 3) {
myAddr.sin_port = htons(atoi(argv[2]));
} else {
myAddr.sin_port = htons(PORT);
}
//绑定本地套接字
if(bind(myFd, (struct sockaddr *)&myAddr, sizeof(myAddr)) != 0) {
printf("%s Line number:%d bind()错误码:%d, %sn",
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
}
//设置IP_MULTICAST_LOOP
u_char loop = 1;
if (setsockopt(myFd, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, sizeof(loop)) != 0) {
printf("%s Line number:%d setsockopt()错误码:%d, %sn",
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
}
//设置IP_MULTICAST_TTL 为1,即该多播最多只能经过一个路由器
u_char ttl;
if (setsockopt(myFd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) != 0) {
printf("%s Line number:%d setsockopt()错误码:%d, %sn",
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
}
//对struct ip_mreq这个结构体赋值
if (argc > 1) { //设置IP地址
int res;
if ((res = inet_pton(AF_INET, argv[1], &mreq.imr_multiaddr)) == -1) {
printf("%s Line number:%d setsockopt()错误码:%d, %sn",
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
} else if(res == 0) {
printf("IP地址无效n");
printf("请输入一个多播地址:224.0.0.1 ~ 239.255.255.255n");
return 0;
}
} else {
printf("Usage:%s 多播地址(224.0.0.1 ~ 239.255.255.255)n", argv[0]);
return(0);
}
mreq.imr_interface.s_addr = INADDR_ANY;
//将本机加入多播组中
if (setsockopt (myFd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) {
printf("%s Line number:%d setsockopt()错误码:%d, %sn",
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
}
printf("客户端已启动,等待多播消息.....n");
while (1) {
bzero(buf, sizeof(buf));
if (recvfrom(myFd, buf, sizeof(buf) - 1, 0,
(struct sockaddr *)&clientAddr, &addrlen) == -1) {
printf("%s Line number:%d recvfrom()错误码:%d, %sn",
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
}
printf("收到来自%s的消息:%s",
inet_ntop(AF_INET, &clientAddr.sin_addr, addrTemp, sizeof(addrTemp)), buf);
if (strcmp("exitn", buf) == 0) {
break;
}
}
//退出广播组
if (setsockopt (myFd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq)) != 0) {
printf("%s Line number:%d setsockopt()错误码:%d, %sn",
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
}
return 0;
}
|
u_char ttl;//没赋值?
if (setsockopt(myFd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) != 0) {
printf("%s Line number:%d setsockopt()错误码:%d, %sn",
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
}
if (setsockopt(myFd, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl)) != 0) {
printf("%s Line number:%d setsockopt()错误码:%d, %sn",
__FILE__, __LINE__, errno, strerror(errno));
exit(errno);
}
|
多播这个东西不是说路由器不一定支持吗.