u_mctest.c
上传用户:kangyuanty
上传日期:2007-01-03
资源大小:17k
文件大小:4k
源码类别:

Internet/IE编程

开发平台:

Visual C++

  1. /*
  2.  * u_mctest.c            (c) Bob Quinn           2/4/97
  3.  *
  4.  * Released to the public domain
  5.  *
  6.  * Description:
  7.  *  Tries out BSD-compatible Multicast APIs, and sends multicast 
  8.  *  messages in response to multicast messages received.  
  9.  */
  10. #ifndef _WIN32
  11. #include <sys/types.h>
  12. #include <sys/socket.h>
  13. #include <netinet/in.h>
  14. #include <arpa/inet.h>
  15. #else
  16. #include <winsock2.h>
  17. #include <ws2tcpip.h>
  18. #endif
  19. #define BUFSIZE   1024
  20. #define TTL_VALUE 2
  21. #define TEST_ADDR "234.5.6.7"
  22. #define TEST_PORT 3456
  23. #define LOOPMAX   20
  24. int main()
  25. {
  26.   struct sockaddr_in stLocal, stTo, stFrom;
  27.   char achIn[BUFSIZE];
  28.   char achOut[] = "Message number:              ";
  29.   int s, i;
  30.   struct ip_mreq stMreq;
  31.   int iTmp, iRet;
  32. #ifdef WIN32  
  33.   /* Init WinSock */
  34.   WSADATA stWSAData;
  35.   iTmp = WSAStartup(0x0202, &stWSAData);
  36.   if (iTmp) {
  37.     printf ("WSAStartup failed: Err: %drn", iTmp);
  38.     exit (1);
  39.   }
  40. #endif
  41.   /* get a datagram socket */
  42.   s = socket(AF_INET, 
  43.      SOCK_DGRAM, 
  44.      0);
  45.   if (s == INVALID_SOCKET) {
  46.     printf ("socket() failed, Err: %dn", WSAGetLastError());
  47.     exit(1);
  48.   }
  49.   /* avoid EADDRINUSE error on bind() */ 
  50.   iTmp = TRUE;
  51.   iRet = setsockopt(s, 
  52.      SOL_SOCKET, 
  53.      SO_REUSEADDR, 
  54.      (char *)&iTmp, 
  55.      sizeof(iTmp));
  56.   if (iRet == SOCKET_ERROR) {
  57.     printf ("setsockopt() SO_REUSEADDR failed, Err: %dn",
  58.       WSAGetLastError());
  59.   }
  60.   /* name the socket */
  61.   stLocal.sin_family =   AF_INET;
  62.   stLocal.sin_addr.s_addr = htonl(INADDR_ANY);
  63.   stLocal.sin_port =   htons(TEST_PORT);
  64.   iRet = bind(s, (struct sockaddr*) &stLocal, sizeof(stLocal));
  65.   if (iRet == SOCKET_ERROR) {
  66.     printf ("bind() failed, Err: %dn",
  67.       WSAGetLastError());
  68.   }
  69.   /* join the multicast group. */
  70.   stMreq.imr_multiaddr.s_addr = inet_addr(TEST_ADDR);
  71.   stMreq.imr_interface.s_addr = INADDR_ANY;
  72.   iRet = setsockopt(s, 
  73.      IPPROTO_IP, 
  74.      IP_ADD_MEMBERSHIP, 
  75.      (char *)&stMreq, 
  76.      sizeof(stMreq));
  77.   if (iRet == SOCKET_ERROR) {
  78.     printf ("setsockopt() IP_ADD_MEMBERSHIP failed, Err: %dn",
  79.       WSAGetLastError());
  80.   } 
  81.   /* set TTL to traverse up to multiple routers */
  82.   iTmp = TTL_VALUE;
  83.   iRet = setsockopt(s, 
  84.      IPPROTO_IP, 
  85.      IP_MULTICAST_TTL, 
  86.      (char *)&iTmp, 
  87.      sizeof(iTmp));
  88.   if (iRet == SOCKET_ERROR) {
  89.     printf ("setsockopt() IP_MULTICAST_TTL failed, Err: %dn",
  90.       WSAGetLastError());
  91.   }
  92.   /* disable loopback */
  93.   iTmp = FALSE;
  94.   iRet = setsockopt(s, 
  95.      IPPROTO_IP, 
  96.      IP_MULTICAST_LOOP, 
  97.      (char *)&iTmp, 
  98.      sizeof(iTmp));
  99.   if (iRet == SOCKET_ERROR) {
  100.     printf ("setsockopt() IP_MULTICAST_LOOP failed, Err: %dn",
  101.       WSAGetLastError());
  102.   }
  103.   /* assign our destination address */
  104.   stTo.sin_family =      AF_INET;
  105.   stTo.sin_addr.s_addr = inet_addr(TEST_ADDR);
  106.   stTo.sin_port =        htons(TEST_PORT);
  107.   printf ("Now sending to (and receiving from) multicast group: %sn",
  108.     TEST_ADDR);
  109.   for (i=0;i<LOOPMAX;i++) {
  110.     int addr_size = sizeof(struct sockaddr_in);
  111.     static iCounter = 1;
  112.     /* send to the multicast address */
  113.     itoa(iCounter++, &achOut[16], 10);
  114.     iRet = sendto(s, 
  115.       achOut, 
  116.       sizeof(achOut), 
  117.       0,
  118.       (struct sockaddr*)&stTo, 
  119.       addr_size);
  120.     if (iRet < 0) {
  121. //      perror("sendto() failedn");
  122.       printf ("sendto() failed, Error: %dn", WSAGetLastError());
  123.       exit(1);
  124.     }
  125.     iRet = recvfrom(s, 
  126.       achIn, 
  127.       BUFSIZE, 
  128.       0,
  129.       (struct sockaddr*)&stFrom, 
  130.       &addr_size);
  131.     if (iRet < 0) {
  132. //      perror("recvfrom() failedn");
  133.       printf ("sendto() failed, Error: %dn", WSAGetLastError());
  134.       exit(1);
  135.     }
  136.     printf("From host:%s port:%d, %sn",
  137.       inet_ntoa(stFrom.sin_addr), 
  138.       ntohs(stFrom.sin_port), achIn);
  139.   } /* end for(;;) */
  140. #ifdef WIN32
  141.   /* sign-off WinSock */
  142.   WSACleanup();
  143. #endif
  144.   
  145. } /* end main() */