zoukankan      html  css  js  c++  java
  • 广播

    只有通过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("广播默认打开
    "); 
    } 
    else 
    { 
        printf("广播默认关闭
    "); 
    } 
    输出为 默认关闭,因此要发生广播报文,必须首先启用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
    ",WSAGetLastError()); 
            break; 
        } 
        else 
        { 
            printf("recvd %d bytes
    ", ret); 
        } 
    } 
  • 相关阅读:
    MySql多表循环遍历更新
    GridView控件的选择功能,代码实现CheckBox控件的全选、反选以及取消
    使用HTTP POST请求12306网站接口查询火车车次API
    GridView控件的绑定分页功能
    使用HTTP GET请求12306网站接口获取车站名和车站Code
    浅谈从Oracle数据库中取出10条数据的Select语句与Sql Server、MySql的区别
    2022 程序员口语提升指南
    R语言与java整合
    新浪的股票接口 c# (收藏)
    摘记
  • 原文地址:https://www.cnblogs.com/profession/p/4464433.html
Copyright © 2011-2022 走看看