勤能补拙,Expter

成都游戏Coder,记录游戏开发过程的笔记和心得!

广播实现代码

首先 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;
}


posted on 2008-12-08 10:44 expter 阅读(1725) 评论(0)  编辑 收藏 引用 所属分类: 工作笔记算法与数据结构


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理