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

Internet/IE编程

开发平台:

Visual C++

  1. /*
  2.  * w_mctest.c              (c) Bob Quinn              2/4/97
  3.  *
  4.  * Released to the public domain
  5.  *
  6.  * Description:
  7.  *  Tries out new WinSock 2 Multicast APIs, and sends multicast 
  8.  *  messages in response to multicast messages received.
  9.  */
  10. #include <winsock2.h>
  11. #define BUFSIZE     1024
  12. #define MAXADDRSTR  16
  13. #define LOOPMAX     20
  14. int main() {
  15.     int nRet, i;
  16.     int nIP_TTL = 2;
  17.     BOOL  bFlag;
  18.     DWORD dFlag;
  19.     DWORD cbRet;
  20.     int iLen = MAXADDRSTR;
  21.     char strDestMulti[MAXADDRSTR] = "234.5.6.7";
  22.     SOCKADDR_IN stSrcAddr, stDestAddr;
  23.     SOCKET hSock, hNewSock;
  24.     u_short nDestPort = 3456;
  25.     WSABUF stWSABuf;
  26.     char achInBuf [BUFSIZE];
  27.     char achOutBuf[] = "Message number:             ";
  28.     WSADATA stWSAData;
  29.     /* init WinSock */
  30.     nRet = WSAStartup(0x0202, &stWSAData);
  31.     if (nRet) {
  32.   printf ("WSAStartup failed: %drn", nRet);
  33.   exit (1);
  34.     }
  35.     /* convert address string to value */
  36. stDestAddr.sin_family = AF_INET; /* MUST be initialised */
  37. nRet = WSAStringToAddress (
  38. strDestMulti,    /* address string */
  39. AF_INET,         /* address family */
  40. NULL,            /* protocol info structure */
  41. (LPSOCKADDR)&stDestAddr,/* socket address string */
  42.         &iLen);          /* length of socket structure */
  43. if (nRet) {
  44. printf ("WSAStringToAddress(%s) failed, Err: %dn", 
  45.           strDestMulti, WSAGetLastError());
  46. exit(1);
  47.     }
  48. /* get a socket */
  49. hSock = WSASocket(AF_INET, SOCK_DGRAM, 0,
  50.   (LPWSAPROTOCOL_INFO)NULL, 0, 
  51.   WSA_FLAG_MULTIPOINT_C_LEAF | WSA_FLAG_MULTIPOINT_D_LEAF);
  52. if (hSock == INVALID_SOCKET) {
  53. printf ("WSASocket() failed, Err: %dn", WSAGetLastError());
  54. exit (1);
  55.     } else {
  56. printf ("WSASocket() returned socket handle: %dn",hSock);
  57. }
  58. /* allow reuse of the local port number */
  59. bFlag = TRUE;
  60. nRet = setsockopt(
  61. hSock, /* socket */
  62. SOL_SOCKET, /* socket level */
  63. SO_REUSEADDR, /* socket option */
  64. (char *)&bFlag, /* option value */
  65. sizeof (bFlag)); /* size of value */
  66. if (nRet == SOCKET_ERROR) {
  67. printf("setsockopt() SO_REUSEADDR failed, Err: %dn",
  68. WSAGetLastError());
  69. }
  70.     /* name the socket */
  71.     stSrcAddr.sin_family = PF_INET;
  72.     stSrcAddr.sin_port = htons (nDestPort);
  73.     stSrcAddr.sin_addr.s_addr = INADDR_ANY;
  74.     nRet = bind (
  75.         hSock, 
  76.         (struct sockaddr FAR *)&stSrcAddr, 
  77.         sizeof(struct sockaddr));
  78.     if (nRet == SOCKET_ERROR) {
  79. printf ("bind(socket: %d, port: %d) failed, Err: %dn",
  80. hSock, nDestPort, WSAGetLastError());
  81.     } else {
  82. printf("bind(socket: %d, port: %d) succeededrn", 
  83. hSock, ntohs(stSrcAddr.sin_port));
  84. }
  85.     stDestAddr.sin_family = PF_INET;
  86. nRet = WSAHtons(
  87. hSock,          /* socket */
  88. nDestPort,      /* host order value */
  89. &(stDestAddr.sin_port));/* network order value */
  90. if (nRet == SOCKET_ERROR) {
  91. printf("WSAHtons() failed, Err: %dn", WSAGetLastError());
  92. }
  93.     /* set the IP TTL */ 
  94.     nRet = WSAIoctl (hSock,     /* socket */
  95.         SIO_MULTICAST_SCOPE,    /* IP Time-To-Live */
  96.         &nIP_TTL,               /* input */
  97.         sizeof (nIP_TTL),       /* size */
  98. //        NULL,                   /* output */  // fails w/ 10014 with this
  99.         achInBuf,               /* output */
  100. //        0,                      /* size */
  101.         BUFSIZE,                /* size */
  102.         &cbRet,                 /* bytes returned */
  103.         NULL,                   /* overlapped */
  104.         NULL);                  /* completion routine */
  105.     
  106.     if (nRet) {
  107.       printf ("WSAIoctl(SIO_MULTICAST_SCOPE) failed, Err: %dn",
  108.     WSAGetLastError());
  109.     } else {
  110.   printf ("WSAIoctl(SIO_MULTICAST_SCOPE: %d) succeededrn",
  111. nIP_TTL);
  112.     }
  113.     /* disable loopback */
  114.     bFlag = FALSE;
  115.     nRet = WSAIoctl (hSock,     /* socket */
  116.         SIO_MULTIPOINT_LOOPBACK,/* LoopBack on or off */
  117.         &bFlag, /* input */
  118.         sizeof (bFlag),         /* size */
  119. //        NULL,                   /* output */  // fails with 10014 with this
  120.         achInBuf,               /* output */
  121. //        0,                      /* size */
  122.         BUFSIZE,                /* size */
  123.         &cbRet,                 /* bytes returned */
  124.         NULL,                   /* overlapped */
  125.         NULL);                  /* completion routine */
  126.       
  127.     if (nRet) {
  128.        printf("WSAIoctl(SIO_MULTIPOINT_LOOPBACK) failed, Err: %dn",
  129.      WSAGetLastError());
  130.     } else {
  131.    printf ("WSAIoctl(SIO_MULTIPOINT_LOOPBACK: %d) succeededrn",
  132.  nIP_TTL);
  133.     }
  134.     /* join the multicast group */
  135.     hNewSock = WSAJoinLeaf (hSock, /* socket */
  136.         (PSOCKADDR)&stDestAddr, /* multicast address */
  137.         sizeof (stDestAddr),    /* length of addr struct */
  138.         NULL,                   /* caller data buffer */
  139.         NULL,                   /* callee data buffer */
  140.         NULL,                   /* socket QOS setting */
  141.         NULL,                   /* socket group QOS */
  142.         JL_BOTH);               /* do both: send *and* receive */
  143.     if (hNewSock == INVALID_SOCKET) {
  144.   printf ("WSAJoinLeaf() failed, Err: %dn",
  145. WSAGetLastError());
  146.     } else {
  147.   printf ("WSAJoinLeaf(%s) succeededn", strDestMulti);
  148.     }
  149.     printf ("Now sending to (and receiving from) multicast group: %sn",
  150.       strDestMulti);
  151.     /* send and receive loop */
  152.     for (i=0;i<LOOPMAX;i++) {
  153.       static iCounter = 1;
  154.       /* send data */
  155.       stWSABuf.buf = achOutBuf;
  156.       stWSABuf.len = lstrlen(achOutBuf);
  157.       cbRet = 0;
  158.       itoa(iCounter++, &achOutBuf[16], 10);
  159.       nRet = WSASendTo (hSock,   /* socket */
  160.   &stWSABuf,               /* output buffer structure */
  161.   1,                       /* buffer count */
  162.   &cbRet,                  /* number of bytes sent */
  163.   0,    /* flags */
  164.   (struct sockaddr*)&stDestAddr,/* destination address */
  165.   sizeof(struct sockaddr), /* size of addr structure */
  166.   NULL,                    /* overlapped structure */
  167.   NULL);                   /* overlapped callback function */
  168. if (nRet == SOCKET_ERROR) {
  169.   printf("WSASendTo() failed, Err: %dn", WSAGetLastError());
  170. } else {
  171.   printf (
  172.        "WSASendTo() successfully sent %d bytes to %d.%d.%d.%d, port %drn",
  173. cbRet,
  174. stDestAddr.sin_addr.S_un.S_un_b.s_b1,
  175. stDestAddr.sin_addr.S_un.S_un_b.s_b2,
  176. stDestAddr.sin_addr.S_un.S_un_b.s_b3,
  177. stDestAddr.sin_addr.S_un.S_un_b.s_b4,
  178. htons(stDestAddr.sin_port));
  179. }
  180. stWSABuf.buf = achInBuf;
  181. stWSABuf.len = BUFSIZE;
  182. cbRet = 0;
  183. iLen = sizeof (stSrcAddr);
  184. dFlag = 0;
  185.     nRet = WSARecvFrom (hSock, /* socket */
  186.   &stWSABuf,               /* input buffer structure */
  187.   1,                       /* buffer count */
  188.   &cbRet,                  /* number of bytes recv'd */
  189.   &dFlag,                 /* flags */
  190.                   (struct sockaddr *)&stSrcAddr,/* source address */
  191.   &iLen,                   /* size of addr structure */
  192.   NULL,                    /* overlapped structure */
  193.   NULL);                   /* overlapped callback function */
  194. if (nRet == SOCKET_ERROR) {
  195. printf("WSARecvFrom() failed, Err:%dn", WSAGetLastError());
  196. } else {
  197. /* convert address value to string */
  198. u_short nPort = 0;
  199. //                      char achAddr[MAXADDRSTR] = {0}; // fails with non-WinSock Err 122
  200. char achAddr[BUFSIZE];
  201. // iLen = MAXADDRSTR;
  202. iLen = BUFSIZE;
  203. nRet = WSAAddressToString(
  204. (struct sockaddr *)&stSrcAddr, /* source address */
  205. sizeof(stSrcAddr),  /* size of addr struct */
  206. NULL,               /* protocol info */
  207. achAddr,            /* address string */
  208. &iLen);             /* addr string buf len */
  209. if (nRet == SOCKET_ERROR) {
  210. printf("WSAAddressToString() failed, Err: %dn",
  211. WSAGetLastError());
  212. }
  213. /* convert from network to host byte order */
  214. nRet = WSANtohs(hSock,      /* socket */
  215. stSrcAddr.sin_port, /* host order value */
  216. &nPort);            /* network order value */
  217. if (nRet == SOCKET_ERROR) {
  218. printf("WSANtohs() failed, Err: %dn", WSAGetLastError());
  219. }
  220.     printf (
  221. "WSARecvFrom() received %d bytes from %s, port %d :%srn",
  222.    cbRet,
  223.    achAddr[0] ? achAddr : "??",
  224.    nPort,
  225.    achInBuf);
  226.     }
  227. } /* end for(;;) */
  228.   /* tell WinSock we're leaving */
  229.   WSACleanup();
  230.   return (0);
  231. } /* end main() */