基于UDP协议的广播程序实例

今晚写了一个简单的局域网内同一子网的广播程序,总结起来关键 点主要是:

1。往同一子网内所有机器发送消息的地址为: 255.255.255.255 这是TCP/IP协议关于IP分配中规定的,其他特殊的地址也有不同的意义~具体可以参考RFC 相关文档

2。广播消息只能给予UDP协议,原因是UDP是面向无连接的,不像TCP一样正式通信之前要进行“三次握手”,从而建立端对端(end to end)的连接。

3。设置好SOCKET的工作方式,即设置为广播方式。调用setsockopt(.....)函数实现

以下是实现的代码(最精简的):

1。发送消息方:

#define INADDR_BROADCAST (u_long)0xFFFFFFFF

void CserverDlg::OnBnClickedButton1()
{
    WSADATA wsaData;
    WORD wVersion=0x0202;
    sockaddr_in server_addr,client_addr;
    if (WSAStartup(wVersion,&wsaData)!=0)
    {
        AfxMessageBox("WSAStartup fail!");
        return;
    }
    SOCKET server=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    server_addr.sin_addr.S_un.S_addr=INADDR_ANY;
    server_addr.sin_family=AF_INET;
    //server_addr.sin_port=htons();
    //bind(server,(sockaddr*)&server_addr,sizeof(server_addr));
    char buff[255];
    CString strText;
    GetDlgItem(IDC_EDIT1)->GetWindowText(strText);
   
    strcpy(buff,strText);
    AfxMessageBox(buff);
    int iLen=sizeof(buff);
    client_addr.sin_addr.S_un.S_addr=INADDR_BROADCAST;
    client_addr.sin_family=AF_INET;
    client_addr.sin_port=htons(8000);
    BOOL bBroadcast;
    //设置广播工作方式,关键
    setsockopt(server,SOL_SOCKET,SO_BROADCAST,(char*)&bBroadcast,sizeof(bBroadcast));
    sendto(server,buff,iLen,0,(sockaddr*)&client_addr,sizeof(client_addr));
    closesocket(server);
    WSACleanup();
}

接收消息方:

void CclientDlg::OnBnClickedButton1()
{
    WSADATA wsaData;
    WORD wVersion=0x0202;
    sockaddr_in server_addr,client_addr;
    if (WSAStartup(wVersion,&wsaData)!=0)
    {
        AfxMessageBox("WSAStartup fail!");
        return;
    }
    SOCKET client=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    client_addr.sin_addr.S_un.S_addr=INADDR_ANY;
    client_addr.sin_family=AF_INET;
    client_addr.sin_port=htons(8000);
    bind(client,(sockaddr*)&client_addr,sizeof(client_addr));
    char buff[255];
    int iLen;
    iLen=sizeof(server_addr);
    while (1)
    {
        if (recvfrom(client,buff,sizeof(buff),0,(sockaddr*)&server_addr,&iLen)>0)
           
            break;
    }
    GetDlgItem(IDC_EDIT1)->SetWindowText(buff);
    closesocket(client);
    WSACleanup();

以上为阻塞式通讯方式,通过直接的API函数实现。若用MFC Windows Socket 类则更加方便实用。程序在宿舍楼局域网运行通过~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值