w_mctest.c
资源名称:multicast.zip [点击查看]
上传用户:kangyuanty
上传日期:2007-01-03
资源大小:17k
文件大小:8k
源码类别:
Internet/IE编程
开发平台:
Visual C++
- /*
- * w_mctest.c (c) Bob Quinn 2/4/97
- *
- * Released to the public domain
- *
- * Description:
- * Tries out new WinSock 2 Multicast APIs, and sends multicast
- * messages in response to multicast messages received.
- */
- #include <winsock2.h>
- #define BUFSIZE 1024
- #define MAXADDRSTR 16
- #define LOOPMAX 20
- int main() {
- int nRet, i;
- int nIP_TTL = 2;
- BOOL bFlag;
- DWORD dFlag;
- DWORD cbRet;
- int iLen = MAXADDRSTR;
- char strDestMulti[MAXADDRSTR] = "234.5.6.7";
- SOCKADDR_IN stSrcAddr, stDestAddr;
- SOCKET hSock, hNewSock;
- u_short nDestPort = 3456;
- WSABUF stWSABuf;
- char achInBuf [BUFSIZE];
- char achOutBuf[] = "Message number: ";
- WSADATA stWSAData;
- /* init WinSock */
- nRet = WSAStartup(0x0202, &stWSAData);
- if (nRet) {
- printf ("WSAStartup failed: %drn", nRet);
- exit (1);
- }
- /* convert address string to value */
- stDestAddr.sin_family = AF_INET; /* MUST be initialised */
- nRet = WSAStringToAddress (
- strDestMulti, /* address string */
- AF_INET, /* address family */
- NULL, /* protocol info structure */
- (LPSOCKADDR)&stDestAddr,/* socket address string */
- &iLen); /* length of socket structure */
- if (nRet) {
- printf ("WSAStringToAddress(%s) failed, Err: %dn",
- strDestMulti, WSAGetLastError());
- exit(1);
- }
- /* get a socket */
- hSock = WSASocket(AF_INET, SOCK_DGRAM, 0,
- (LPWSAPROTOCOL_INFO)NULL, 0,
- WSA_FLAG_MULTIPOINT_C_LEAF | WSA_FLAG_MULTIPOINT_D_LEAF);
- if (hSock == INVALID_SOCKET) {
- printf ("WSASocket() failed, Err: %dn", WSAGetLastError());
- exit (1);
- } else {
- printf ("WSASocket() returned socket handle: %dn",hSock);
- }
- /* allow reuse of the local port number */
- bFlag = TRUE;
- nRet = setsockopt(
- hSock, /* socket */
- SOL_SOCKET, /* socket level */
- SO_REUSEADDR, /* socket option */
- (char *)&bFlag, /* option value */
- sizeof (bFlag)); /* size of value */
- if (nRet == SOCKET_ERROR) {
- printf("setsockopt() SO_REUSEADDR failed, Err: %dn",
- WSAGetLastError());
- }
- /* name the socket */
- stSrcAddr.sin_family = PF_INET;
- stSrcAddr.sin_port = htons (nDestPort);
- stSrcAddr.sin_addr.s_addr = INADDR_ANY;
- nRet = bind (
- hSock,
- (struct sockaddr FAR *)&stSrcAddr,
- sizeof(struct sockaddr));
- if (nRet == SOCKET_ERROR) {
- printf ("bind(socket: %d, port: %d) failed, Err: %dn",
- hSock, nDestPort, WSAGetLastError());
- } else {
- printf("bind(socket: %d, port: %d) succeededrn",
- hSock, ntohs(stSrcAddr.sin_port));
- }
- stDestAddr.sin_family = PF_INET;
- nRet = WSAHtons(
- hSock, /* socket */
- nDestPort, /* host order value */
- &(stDestAddr.sin_port));/* network order value */
- if (nRet == SOCKET_ERROR) {
- printf("WSAHtons() failed, Err: %dn", WSAGetLastError());
- }
- /* set the IP TTL */
- nRet = WSAIoctl (hSock, /* socket */
- SIO_MULTICAST_SCOPE, /* IP Time-To-Live */
- &nIP_TTL, /* input */
- sizeof (nIP_TTL), /* size */
- // NULL, /* output */ // fails w/ 10014 with this
- achInBuf, /* output */
- // 0, /* size */
- BUFSIZE, /* size */
- &cbRet, /* bytes returned */
- NULL, /* overlapped */
- NULL); /* completion routine */
- if (nRet) {
- printf ("WSAIoctl(SIO_MULTICAST_SCOPE) failed, Err: %dn",
- WSAGetLastError());
- } else {
- printf ("WSAIoctl(SIO_MULTICAST_SCOPE: %d) succeededrn",
- nIP_TTL);
- }
- /* disable loopback */
- bFlag = FALSE;
- nRet = WSAIoctl (hSock, /* socket */
- SIO_MULTIPOINT_LOOPBACK,/* LoopBack on or off */
- &bFlag, /* input */
- sizeof (bFlag), /* size */
- // NULL, /* output */ // fails with 10014 with this
- achInBuf, /* output */
- // 0, /* size */
- BUFSIZE, /* size */
- &cbRet, /* bytes returned */
- NULL, /* overlapped */
- NULL); /* completion routine */
- if (nRet) {
- printf("WSAIoctl(SIO_MULTIPOINT_LOOPBACK) failed, Err: %dn",
- WSAGetLastError());
- } else {
- printf ("WSAIoctl(SIO_MULTIPOINT_LOOPBACK: %d) succeededrn",
- nIP_TTL);
- }
- /* join the multicast group */
- hNewSock = WSAJoinLeaf (hSock, /* socket */
- (PSOCKADDR)&stDestAddr, /* multicast address */
- sizeof (stDestAddr), /* length of addr struct */
- NULL, /* caller data buffer */
- NULL, /* callee data buffer */
- NULL, /* socket QOS setting */
- NULL, /* socket group QOS */
- JL_BOTH); /* do both: send *and* receive */
- if (hNewSock == INVALID_SOCKET) {
- printf ("WSAJoinLeaf() failed, Err: %dn",
- WSAGetLastError());
- } else {
- printf ("WSAJoinLeaf(%s) succeededn", strDestMulti);
- }
- printf ("Now sending to (and receiving from) multicast group: %sn",
- strDestMulti);
- /* send and receive loop */
- for (i=0;i<LOOPMAX;i++) {
- static iCounter = 1;
- /* send data */
- stWSABuf.buf = achOutBuf;
- stWSABuf.len = lstrlen(achOutBuf);
- cbRet = 0;
- itoa(iCounter++, &achOutBuf[16], 10);
- nRet = WSASendTo (hSock, /* socket */
- &stWSABuf, /* output buffer structure */
- 1, /* buffer count */
- &cbRet, /* number of bytes sent */
- 0, /* flags */
- (struct sockaddr*)&stDestAddr,/* destination address */
- sizeof(struct sockaddr), /* size of addr structure */
- NULL, /* overlapped structure */
- NULL); /* overlapped callback function */
- if (nRet == SOCKET_ERROR) {
- printf("WSASendTo() failed, Err: %dn", WSAGetLastError());
- } else {
- printf (
- "WSASendTo() successfully sent %d bytes to %d.%d.%d.%d, port %drn",
- cbRet,
- stDestAddr.sin_addr.S_un.S_un_b.s_b1,
- stDestAddr.sin_addr.S_un.S_un_b.s_b2,
- stDestAddr.sin_addr.S_un.S_un_b.s_b3,
- stDestAddr.sin_addr.S_un.S_un_b.s_b4,
- htons(stDestAddr.sin_port));
- }
- stWSABuf.buf = achInBuf;
- stWSABuf.len = BUFSIZE;
- cbRet = 0;
- iLen = sizeof (stSrcAddr);
- dFlag = 0;
- nRet = WSARecvFrom (hSock, /* socket */
- &stWSABuf, /* input buffer structure */
- 1, /* buffer count */
- &cbRet, /* number of bytes recv'd */
- &dFlag, /* flags */
- (struct sockaddr *)&stSrcAddr,/* source address */
- &iLen, /* size of addr structure */
- NULL, /* overlapped structure */
- NULL); /* overlapped callback function */
- if (nRet == SOCKET_ERROR) {
- printf("WSARecvFrom() failed, Err:%dn", WSAGetLastError());
- } else {
- /* convert address value to string */
- u_short nPort = 0;
- // char achAddr[MAXADDRSTR] = {0}; // fails with non-WinSock Err 122
- char achAddr[BUFSIZE];
- // iLen = MAXADDRSTR;
- iLen = BUFSIZE;
- nRet = WSAAddressToString(
- (struct sockaddr *)&stSrcAddr, /* source address */
- sizeof(stSrcAddr), /* size of addr struct */
- NULL, /* protocol info */
- achAddr, /* address string */
- &iLen); /* addr string buf len */
- if (nRet == SOCKET_ERROR) {
- printf("WSAAddressToString() failed, Err: %dn",
- WSAGetLastError());
- }
- /* convert from network to host byte order */
- nRet = WSANtohs(hSock, /* socket */
- stSrcAddr.sin_port, /* host order value */
- &nPort); /* network order value */
- if (nRet == SOCKET_ERROR) {
- printf("WSANtohs() failed, Err: %dn", WSAGetLastError());
- }
- printf (
- "WSARecvFrom() received %d bytes from %s, port %d :%srn",
- cbRet,
- achAddr[0] ? achAddr : "??",
- nPort,
- achInBuf);
- }
- } /* end for(;;) */
- /* tell WinSock we're leaving */
- WSACleanup();
- return (0);
- } /* end main() */