大家好,我现在正在学基于c#的网络编程.
现在我想学关于在一个网段内进行多播的技术,大家可以帮我找找关于这方面的代码吗.
如果是关于多播的原理也可以,只要和多播有关的资料,我都需要,不管是网页还是电子书.
如果有的话,可以发给我吗. email:   [email protected]
谢谢了

解决方案 »

  1.   

    原理就看TCP/IP详解
    C的代码有 windows网络编程 C sharp就不晓得啦。
      

  2.   

    http://www.vckbase.com/code/downcode.asp?id=2145用UDP协议实现广播通信
    作者/JSPHuang
    下载源代码 
    UDP 是USER DATAGRAM PROTOCAL 的简称,是一种在网络上提供的无连接的传输协议。
    用UDP通信有以下特点: 1、 数据传输不用建立连接,所以不可靠; 
    2、 数据的发送是面向整个网络的,任何一台在局域网内的计算机都可以接收到相同的数据; 
    具体实现很简单,但是现在在网络上很少看到这方面的代码;我也参考了VCKBASE上的关于UDP通信的原代码和一些书籍,写了这个简单的客户端,接收端程序,起到抛砖引玉的作用,希望能给初次接触UDP之BROADCAST编程的同志一些参考。下面就让我来说一下工作流程, 接收端的程序:  启动SOCKET库,版本为2.0
    WSAStartup(0x0202,&wsdata);      
    然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息;  ......
             a.sin_family=AF_INET;
    a.sin_addr.s_addr=0;
    a.sin_port=htons(5050); from.sin_family=AF_INET;
    from.sin_addr.s_addr=INADDR_BROADCAST;
    from.sin_port=htons(5050);
    int fromlength=sizeof(SOCKADDR);
    //用UDP初始化套接字
    s=socket(AF_INET,SOCK_DGRAM,0);
             //设置该套接字为广播类型,
    setsockopt(s,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof(optval));
    //把该套接字绑定在一个具体的地址上
             bind(s,(sockaddr *)&a,sizeof(sockaddr_in));
    char buf[256];
    while(1)
    { //从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的
    recvfrom(s,buf,256,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength);
    Sleep(2000);
    printf("%s\n",buf);
    ZeroMemory(buf,256);
    }
             .....
          
    无连接协议不用LISTEN也不用ACCEPT,他直接从广播地址上接收消息,但我们必须要设置该套接字为广播类型。
    发送端的程序比较简单,只要将发送地址改为广播地址,设置套接字为BROADCAST类型就行,具体实现细节请参见源代码。
    在VC6。0 WIN 2000下运行通过。 
      

  3.   

    多线程,多播!
    只有UDP才能实现多播,TCP/IP不能!#include <windows.h>
    #include <winsock.h>#include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>#define MCASTADDR "239.1.1.1"
    #define MCASTPORT 5000
    #define BUFSIZE 1024
    #define DEFAULT_COUNT 500BOOL bSender = FALSE;
    BOOL bLoopBack = FALSE ;DWORD dwInterface,
      dwMulticastGroup,
      dwCount ;short iPort ;DWORD WINAPI my_send(void *);
    DWORD WINAPI my_receive(void *);void usage(char *progname)
    {
    printf("example of multicast:%s -s -m:str -p:int -i:str -1 -n:\n",progname);
    }
    void ValidateArgs(int argc, char **argv)
    {

    dwInterface = INADDR_ANY;
    dwMulticastGroup = inet_addr(MCASTADDR);
    iPort = MCASTPORT ;
    dwCount = DEFAULT_COUNT ; if(tolower(*argv[1]) == 's')
    {
    bSender = TRUE ;
    }

    return ;

    } const int on = 1; 
    WSADATA wsd;
    struct sockaddr_in local,
    remote,
    from;
    char recvbuf[BUFSIZE],
    sendbuf[BUFSIZE];
    struct ip_mreq mcast;
    SOCKET sockM,sockN;
    int len = sizeof(struct sockaddr_in),
    optval,
    ret;
    int x = -1; 
    int main(int argc, char **argv)
    {

    DWORD i = 0;
    DWORD dwThreadId_send = 0;
    DWORD dwThreadId_recv = 0;
    HANDLE send_Thread = NULL;
    HANDLE recv_Thread = NULL;
    DWORD dwVesion = 0; strcpy(sendbuf, "hello");
    ValidateArgs(argc, argv);
    if(WSAStartup(MAKEWORD(2,0),&wsd)!=0)
    {
    printf("WSAStartup failed\n");
    WSACleanup();
    return -1 ;
    } if((sockM = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
    {
    printf("soket failed with: %d\n", WSAGetLastError());
    closesocket(sockM);
    WSACleanup();
    return -1;
    }
    if((sockN = socket(AF_INET, SOCK_DGRAM, 0)) == INVALID_SOCKET)
    {
    printf("soket failed with: %d\n", WSAGetLastError());
    closesocket(sockN);
    WSACleanup();
    return -1;
    }
    setsockopt(sockM, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)); 
    setsockopt(sockN, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)); 
    local.sin_family = AF_INET ;
    local.sin_port = htons(iPort) ;
    local.sin_addr.S_un.S_addr  = dwInterface ;
    // printf("haha\n\n\n\n\nhaha");
    if(bind(sockM,(struct sockaddr *)&local,sizeof(local)) == SOCKET_ERROR)
    {
    printf("bind failed") ;
    closesocket(sockM) ;
    WSACleanup() ;
    return -1 ;
    }
    if(bind(sockN,(struct sockaddr *)&local,sizeof(local)) == SOCKET_ERROR)
    {
    printf("bind failed") ;
    closesocket(sockN) ;
    WSACleanup() ;
    return -1 ;
    }
    remote.sin_family = AF_INET ;
    remote.sin_port = htons(iPort) ;
    remote.sin_addr.S_un.S_addr = dwMulticastGroup ; mcast.imr_multiaddr.S_un.S_addr = dwMulticastGroup ;
    mcast.imr_interface.S_un.S_addr = dwInterface ;
    if(setsockopt(sockM, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&mcast, sizeof(mcast)) ==SOCKET_ERROR)
    {
    printf("setsockopt(IP_ADD_MEMBERSHIP) failed: %d\n:", WSAGetLastError());
    closesocket(sockM);
    WSACleanup();
    return -1;
    }
    optval = 8;
    if(setsockopt(sockM, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&optval, sizeof(int)) ==SOCKET_ERROR)
    {
    printf("setsockopt(IP_MULTICAST_TTL) failed: %d\n:", WSAGetLastError());
    closesocket(sockM);
    WSACleanup();
    return -1;
    }
    if(bLoopBack)
    {
    /* optval = 0;
    if(setsockopt(sockM, IPPROTO_IP, IP_MULTICAST_LOOP, (char*)&optval, sizeof(optval)) ==SOCKET_ERROR)
    {
    printf("setsockopt(IP_MULTICAST_LOOP) failed: %d\n:", WSAGetLastError());
    closesocket(sockM);
    WSACleanup();
    return -1;
    }
    */ }
    send_Thread = CreateThread( 
            NULL,                        // default security attributes 
            0,                           // use default stack size  
            my_send,  // thread function 
            NULL, // argument to thread function 
            0,                           // use default creation flags 
            &dwThreadId_send);                // returns the thread identifier  recv_Thread = CreateThread( 
            NULL,                        // default security attributes 
            0,                           // use default stack size  
            my_receive,  // thread function 
            NULL, // argument to thread function 
            0,                           // use default creation flags 
            &dwThreadId_recv);                // returns the thread identifier
    x = getch(); CloseHandle( recv_Thread );
        CloseHandle( send_Thread ); if(setsockopt(sockM, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char*)&mcast, sizeof(mcast)) ==SOCKET_ERROR)
    {
    printf("setsockopt(IP_DROP_MEMBERSHIP) failed: %d\n:", WSAGetLastError());
    }
    closesocket(sockM);
    closesocket(sockN);
    WSACleanup();
    return 0;
    }DWORD WINAPI  my_send(void * p)
    {
    unsigned long i = 0;
    for(i=0; i<dwCount; i++)
    { itoa(i,sendbuf,10);
    printf("server 1: This is a test :%s \n",sendbuf);
    if(sendto(sockN, (char*)sendbuf, strlen(sendbuf), 0, (struct sockaddr*)&remote, sizeof(remote)) == SOCKET_ERROR)
    {
    printf("sendto failed with : %d\n",WSAGetLastError());
    closesocket(sockN);
    WSACleanup();
    return -1;
    }
    Sleep(1000);
    }
    return 0;
    }DWORD WINAPI my_receive(void * p)
    {
    unsigned long i = 0;
    for(i = 0; i<dwCount; i++)
    {
    Sleep(500);
    memset(recvbuf,0,BUFSIZE);
    if((ret = recvfrom(sockM, recvbuf, BUFSIZE, 0, (struct sockaddr *)&from, &len)) == SOCKET_ERROR)
    {
    printf("recvfrom failed with: %d\n:", WSAGetLastError());
    printf("sdf\n");
    closesocket(sockM);
    WSACleanup();
    return -1;
    }
    printf("RECV: '%s' from <%s>\n", recvbuf ,inet_ntoa(from.sin_addr));
    }
    return 0;
    }
      

  4.   

    to wang_yuanwai(王员外) 
    谁说TCP/IP不能?
      

  5.   

    WINDOWS网络编程技术,第十一章讲的就是多播,IP多播和ATM多播。