zoukankan      html  css  js  c++  java
  • SOCKET UDP组播 实例

    阻塞式的基于UDP的组播程序代码,在Windows XP上测试通过~

    客户端Sender.cpp

    #include <WINSOCK.H>
    
    #include <stdio.h>
    
    #define HELLO_PORT  7905    
    
    #define HELLO_GROUP "228.4.5.6"    
    
    #pragma comment(lib, "WSOCK32.lib")
    
     
    
    int main(int argc, char *argv[])    
    
    {    
    
      WSADATA     wsaData;
    
      WORD wVersionRequested;
      wVersionRequested = MAKEWORD(1,1);
      // Initialize Windows socket library
    
      WSAStartup(0x0202, &wsaData);
    
        struct sockaddr_in addr;    
    
        int fd, cnt;    
    
        char *message="Hello, World!";    
    
        /* create what looks like an ordinary UDP socket */    
    
        if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)     
    
        {    
    
            perror("socket");    
    
            exit(1);    
    
        }    
    
        /* set up destination address */    
    
        memset(&addr,0,sizeof(addr));    
    
        addr.sin_family=AF_INET;    
    
        addr.sin_addr.s_addr=inet_addr(HELLO_GROUP);    
    
        addr.sin_port=htons(HELLO_PORT);    
    
        /* now just sendto() our destination! */    
    
        while (1)    
    
        {    
    
            if (sendto(fd,message, strlen(message), 0, (struct sockaddr *) &addr, sizeof(addr)) < 0)     
    
            {    
    
                perror("sendto");    
    
                exit(1);    
    
            }    
    
        printf("Send %s\n",message);
    
            Sleep(1000);    
    
        }    
    
        return 0;    
    
    }    

    服务器端Receiver.cpp

    #include <WINSOCK.H>
    
    #include <stdio.h>
    
    #define HELLO_PORT  7905    
    
    #define HELLO_GROUP "228.4.5.6"    
    
    #define MSGBUFSIZE 256    
    
    #pragma comment(lib, "WSOCK32.lib")
    
    int main(int argc, char *argv[])    
    
    {    
    
      WSADATA     wsaData;
    
      WORD wVersionRequested;// Version
    
      wVersionRequested = MAKEWORD(1,1);//Version Info
    
      // Initialize Windows socket library
    
      WSAStartup(wVersionRequested, &wsaData);
    
        struct sockaddr_in addr;    
    
        int fd, nbytes,addrlen;    
    
        struct ip_mreq mreq;    
    
        char msgbuf[MSGBUFSIZE];    
    
        u_int yes=1; /*** MODIFICATION TO ORIGINAL */    
    
        /* create what looks like an ordinary UDP socket */    
    
        if ((fd=socket(AF_INET,SOCK_DGRAM,0)) < 0)     
    
        {    
    
            perror("socket");    
    
            exit(1);    
    
        }    
    
        /**** MODIFICATION TO ORIGINAL */    
    
        /* allow multiple sockets to use the same PORT number */    
    
        if (setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,(char *)&yes,sizeof(yes)) < 0)     
    
        {    
    
            perror("Reusing ADDR failed");    
    
            exit(1);    
    
        }    
    
        /*** END OF MODIFICATION TO ORIGINAL */    
    
        /* set up destination address */    
    
        memset(&addr,0,sizeof(addr));    
    
        addr.sin_family=AF_INET;    
    
        addr.sin_addr.s_addr=htonl(INADDR_ANY); /* N.B.: differs from sender */    
    
        addr.sin_port=htons(HELLO_PORT);    
    
        /* bind to receive address */    
    
        if (bind(fd,(struct sockaddr *) &addr,sizeof(addr)) < 0)    
    
        {    
    
            perror("bind");    
    
            exit(1);    
    
        }    
    
        /* use setsockopt() to request that the kernel join a multicast group */    
    
        mreq.imr_multiaddr.s_addr=inet_addr(HELLO_GROUP);    
    
        mreq.imr_interface.s_addr=htonl(INADDR_ANY);    
    
        if (setsockopt(fd,IPPROTO_IP,IP_ADD_MEMBERSHIP,(char *)&mreq,sizeof(mreq)) < 0)     
    
        {    
    
        int err=GetLastError();
    
            printf("setsockopt:%d",err);    
    
            exit(1);    
    
        }    
    
        /* now just enter a read-print loop */    
    
        while (1)     
    
        {    
    
            //ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);    
    
            addrlen=sizeof(addr);  
    
        printf("Receiving..."); 
    
            //if((nbytes=recvfrom(fd,msgbuf,MSGBUFSIZE,0,NULL,NULL))<0)
    
        if ((nbytes=recvfrom(fd, msgbuf, MSGBUFSIZE, 0, (struct sockaddr *) &addr, (int *)&addrlen)) < 0)     
    
            {    
    
                perror("recvfrom");    
    
                exit(1);    
    
            } msgbuf[nbytes]  ='\0'; 
    
            printf("%s",msgbuf);    
    
        }    
    
        return 0;    
    
    }  
  • 相关阅读:
    更改数据库sa密码
    单例模式实现 (Singleton)
    linux特殊符号大全
    “增强现实与多媒体”博客园开张了
    关于.NET运行多个版本
    DevExpress V7.2.3源码 Salesman or Opium Up to you
    there is no bool datatype in oralce datatype system
    .NET时代,还有多少人读库源码 求FCL源码
    当学术界在解决其理论问题,工程界形成形成了一个已开发者为核心的生态链
    Div css 管理后台 简易Demo
  • 原文地址:https://www.cnblogs.com/jersey/p/2259985.html
Copyright © 2011-2022 走看看