IP多播的程序,收不到多播数据
编号:QA004718
建立日期: 2003年8月15日 最后修改日期:2003年8月15日
所属类别:
Q
姜志林:
操作系统:WINDOWS 2000
编程工具:VC
问题:我编了一个IP多播的程序,程序初始化部分如下(接受数据部分在别的模块)
。。。。。。
WSADATA d;
int p=WSAStartup(0x202,&d);
if(p!=0)
AfxMessageBox("初始化失败!");
else
AfxMessageBox("初始化成功!");
if (LOBYTE(d.wVersion) !=2 || HIBYTE(d.wVersion) !=2)
{
AfxMessageBox("WinSock DLL不支持2.0版本,MB_OK");
WSACleanup();
return;
}
// TODO: Add extra initialization here
if((s=WSASocket(AF_INET,SOCK_DGRAM,IPPROTO_UDP,NULL,0,WSA_FLAG_OVERLAPPED|WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF))==INVALID_SOCKET)
AfxMessageBox("套接字创建失败!");
else
AfxMessageBox("套接字创建成功!");
int len=sizeof(local);
bool bFlag=TRUE; //设置套接字选项,使套接字为可重用端口地址
if(setsockopt(s,SOL_SOCKET,SO_REUSEADDR,(char*)&bFlag,sizeof(bFlag))!=0)
AfxMessageBox("可重用端口创建失败!");
local.sin_family=AF_INET;
local.sin_port=htonl(6000);
local.sin_addr.S_un.S_un_b.s_b1=10;
local.sin_addr.S_un.S_un_b.s_b2=41;
local.sin_addr.S_un.S_un_b.s_b3=128;
local.sin_addr.S_un.S_un_b.s_b4=174;
llocal.sin_family=AF_INET;
llocal.sin_port=htonl(6000);
llocal.sin_addr.S_un.S_un_b.s_b1=234;
llocal.sin_addr.S_un.S_un_b.s_b2=5;
llocal.sin_addr.S_un.S_un_b.s_b3=6;
llocal.sin_addr.S_un.S_un_b.s_b4=7;
if(bind(s,(SOCKADDR*)&local,len)!=0)
AfxMessageBox("绑定失败!");
//设置多播数据报传播范围(生存时间TTL)
DWORD cbRet;
int ttl=8;
if(WSAIoctl(s,SIO_MULTICAST_SCOPE,&ttl,sizeof(int),NULL,0,&cbRet,NULL,NULL)!=SOCKET_ERROR)
AfxMessageBox("设置多播数据报传播范围成功!");
if((newsock=WSAJoinLeaf(s,(SOCKADDR*)&llocal,sizeof(llocal),NULL,NULL,NULL,NULL,JL_BOTH))!=INVALID_SOCKET)
AfxMessageBox("加入多播组成功!");
WSAAsyncSelect(s,GetSafeHwnd(),WM_CAST,FD_READ);
。。。。。。。。。
我在两个机器上都装了一个,可是根本收不到多播数据,各位帮忙看看程序是否有问题?
我机器的子网掩码为255.255.255.0
网关为10.41.128.1
水平: 中级
A回答:
给你看看我做的吧?
#include "winsock2.h"
#include "ws2tcpip.h"
#include "stdio.h"
#include "stdlib.h"
void main()
{
WSADATA wsd;
struct sockaddr_in local,remote,from;
SOCKET sock,sockM;
int len =sizeof(struct sockaddr_in),optval,ret;
DWORD i=0;
WSAStartup(MAKEWORD(2,2),&wsd);
sock=WSASocket(AF_INET,SOCK_DGRAM,0,NULL,0,WSA_FLAG_MULTIPOINT_C_LEAF|WSA_FLAG_MULTIPOINT_D_LEAF|WSA_FLAG_OVERLAPPED);
local.sin_family=AF_INET;
local.sin_port=htons(5556);
local.sin_addr.s_addr=inet_addr("192.168.0.1");
remote.sin_family=AF_INET;
remote.sin_port=htons(5555);
remote.sin_addr.s_addr=inet_addr("234.25.8.7");
bind(sock,(struct sockaddr*)&local,sizeof(local));
optval=8;
if(setsockopt(sock,IPPROTO_IP,IP_MULTICAST_TTL,(char*)&optval,sizeof(int))==SOCKET_ERROR)
{
int x=WSAGetLastError();
}
/*if(setsockopt(sock,IPPROTO_IP,IP_MULTICAST_LOOP,(char*)&optval,sizeof(optval))==SOCKET_ERROR)
{
int x=WSAGetLastError();
}
WSAJoinLeaf(sock,(SOCKADDR*)&remote,sizeof(remote),NULL,NULL,NULL,NULL,JL_SENDER_ONLY);
*/
sendto(sock,"i love you ,my name is sdlfkjsdkfsdflskdjfks!",500,0,(struct sockaddr*)&remote,sizeof(remote));
closesocket(sock);
WSACleanup();
}
此问题由马文涛回答。
附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, 网络与通信, network, communicate, com, com1, com2。
| |
|
|
| |
|
|