热情软件屋

 

IP多播的程序,收不到多播数据


编号:QA004718
建立日期: 2003年8月15日 最后修改日期:2003年8月15日
所属类别:

姜志林:
    操作系统: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
    水平: 中级

回答:

    给你看看我做的吧?
    #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

 
把这个问题推荐给朋友
   
   
您的意见类别
您的名字
您的电子邮件
您的建议(请尽可能详细)
 
 

版权所有 1997-2008 热情软件屋
如果您有任何建议和意见, 请给我发个电子邮件 askpro@china-askpro.com
Web Designed by ZebraStudio