广播实现代码

广播实现代码

首先 UDP 默认不能实现广播
要实现一个机子的广播,首先 应该明白2个函数
     1.setsockopt 开启发送广播报文
     2.getsockopt 确定广播选项是否关闭

setsockopt 的原型定义:
WINSOCK_API_LINKAGE int WSAAPI setsockopt( IN SOCKET s, IN int level, IN int optname, IN const char FAR * optval, IN int optlen )
开启报文代码

if  (setsockopt(sock,SOL_SOCKET,SO_BROADCAST,( char   * ) & bborad,oplen)  ==  SOCKET_ERROR)
    {
        printf(
" setsockopt error! " );
        
return   0 ;
    }

作为server:
然后发送广播报文
    sockaddr_in addr;
    
int  nlen  =   sizeof (addr);
    memset(
& addr, 0 ,nlen);

    addr.sin_family 
=  AF_INET;
    addr.sin_port 
=  htons( 9999 );
    addr.sin_addr.s_addr 
= INADDR_BROADCAST;

    
const   char   * msg  =   " hello! This is a test! " ;
    
int  len  =  strlen(msg);

    
if  (sendto(sock,msg,len, 0 ,( struct  sockaddr  * ) & addr, sizeof (addr))  ==  SOCKET_ERROR)
    {
        printf(
" send error !! " );
        
return   0 ;
    }


然后客户端:
接受报文:
2008年12月8日
# include  < WinSock2.h >
# include 
< stdio.h >

#pragma   comment(lib,   
" ws2_32.lib " )
#define  WSVERS MAKEWORD(2,0)
// CInitSock initSock;
int  main()
{
    WSADATA wsadata; 
    
    
if (WSAStartup(WSVERS, & wsadata))
    {
        printf(
" WSAStartup failed!\n " );
        
        
return   0 ;
    }
    SOCKET sLiten 
=  ::socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    
if (sLiten  ==  INVALID_SOCKET)
    {
        printf(
" WSACleanup failed with error %d\n " ,WSAGetLastError());
        
// printf(" Failed socket()");
         return   0 ;
    }
    
    sockaddr_in local;
    local.sin_family 
=  AF_INET;
    local.sin_port 
=  htons( 9999 );
    local.sin_addr.s_addr 
= INADDR_ANY;
    
    
if (::bind(sLiten,(LPSOCKADDR) & local, sizeof (local))  ==  SOCKET_ERROR)
    {
        printf(
"  failed bind() " );
        
return   0 ;
    }
    
    
char  buf[ 1024 ];
    sockaddr_in addr;
    
int  nlen  =   sizeof (addr);
    
    
while ( 1 )
    {
        
int  recv  =  ::recvfrom(sLiten,buf, 1024 , 0 ,(sockaddr  * ) & addr, & nlen);
        
if (recv )
        {
            buf[recv] 
=   ' \0 ' ;
            printf(
" 接收到数据  (%s): (%s) " ,::inet_ntoa(addr.sin_addr),buf);
        }
    }
    ::closesocket(sLiten);
    
return 0 ;
}


你可能感兴趣的:(广播实现代码)