广播
只有通过UDP套接字才能实现广播和多播。 报文的发送 在默认情况下,UPD套接字是无法发送广播报文的,套接字启用/禁止广播是通过SOL_SOCKET->SO_BROADCAST选项来完成的。 下面代码,可以确认广播选项是默认关闭的: BOOL bBroadcast; int optlen = sizeof(bBroadcast); if(SOCKET_ERROR==getsockopt(sock,SOL_SOCKET,SO_BROADCAST, (char*)&bBroadcast,&optlen)) { HandleError("getsockopt"); closesocket(sock); WSACleanup(); return -1; } if(bBroadcast) { printf("广播默认打开\n"); } else { printf("广播默认关闭\n"); } 输出为 默认关闭,因此要发生广播报文,必须首先启用SO_BROADCAST选项,如下: bBroadcast = TRUE; optlen = sizeof(bBroadcast); if(SOCKET_ERROR==setsockopt(sock,SOL_SOCKET,SO_BROADCAST, (char*)&bBroadcast,optlen)) { HandleError("setsockopt"); closesocket(sock); WSACleanup(); return -1; } 此时仍然可以调用getsockopt函数检查是否设置成功,成功的设置了SO_BROADCAST后,就可以发送广播报文了 SOCKADDR_IN addr; memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(5050); addr.sin_addr.s_addr=INADDR_BROADCAST; const char* msg="Hello! Broadcast Test"; int len = strlen(msg); if(SOCKET_ERROR==sendto(sock,msg,len,0, (SOCKADDR*)&addr,sizeof(SOCKADDR_IN))) { HandleError("sendto"); closesocket(sock); WSACleanup(); return -1; } winsock定义常量0xffffffff,对应于受限广播地址255.255.255.255。 广播报文的接收 SOCKET sock = socket(AF_INET,SOCK_DGRAM,0); SOCKADDR_IN addr; memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(5050); addr.sin_addr.s_addr=INADDR_ANY; bind(sock,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); int ret; char buf[5000]; while(TRUE) { ret=recvfrom(sock,buf,5000,0,NULL,NULL); if(SOCKET_ERROR==ret) { printf("recvfrom:%d\n",WSAGetLastError()); break; } else { printf("recvd %d bytes\n", ret); } }
posted on 2015-04-28 23:35 strangeman 阅读(173) 评论(0) 编辑 收藏 举报