UDP协议广播如何停止循环,只输出一条信息?

UDP协议广播如何停止循环,只输出一条信息?
问题:想只输出一句“1234端口广播测试”,如何停止这个循环
这是sender端的代码:

#include "stdafx.h"
#include "../../common/initsock.h"
#include "stdio.h"
#include <windows.h>

CInitSock theSock;

int _tmain(int argc, _TCHAR* argv[])
{
    SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);
    // 有效SO_BROADCAST选项
    BOOL bBroadcast = TRUE;
    ::setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(BOOL));

    // 设置广播地址,这里的广播端口号(电台)是1234
    SOCKADDR_IN bcast;
    bcast.sin_family = AF_INET;
    bcast.sin_addr.s_addr = INADDR_BROADCAST; // ::inet_addr("255.255.255.255");
    bcast.sin_port = htons(1234);

    // 发送广播
    printf(" 开始向1234端口发送广播数据... \n \n");
    char sz[] = "1234端口广播测试. \r\n";
    while(TRUE)
    {
        ::sendto(s, sz, strlen(sz), 0, (sockaddr*)&bcast, sizeof(bcast));
        ::Sleep(2000);
        
    }


/*

    ::send(s, sz, strlen(sz), 0);

    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = ntohs(3333);
    addr.sin_addr.S_un.S_addr  = ADDR_ANY;

    if(::bind(s, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR)
    {
        printf(" bind() failed \n");
        return;
    }
*/

    return 0;
}

这里是recver端的代码:

#include "stdafx.h"
#include "../../common/initsock.h"
#include "stdio.h"
#include <windows.h>

CInitSock theSock;

int _tmain(int argc, _TCHAR* argv[])
{
    SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0);

    // 首先要绑定一个本地地址,指明广播端口号
    SOCKADDR_IN sin;
    sin.sin_family = AF_INET;
    sin.sin_addr.S_un.S_addr = INADDR_ANY;    
    sin.sin_port = ::ntohs(1234);
    if(::bind(s, (sockaddr*)&sin, sizeof(sin)) == SOCKET_ERROR)
    {
        printf(" bind() failed \n");
        return 0;
    }

    // 接收广播
    printf(" 开始在1234端口接收广播数据... \n\n");
    SOCKADDR_IN addrRemote;    
    int nLen = sizeof(addrRemote);
    char sz[256];
    while(TRUE)
    {
        int nRet = ::recvfrom(s, sz, 256, 0, (sockaddr*)&addrRemote, &nLen);
        if(nRet > 0)
        {
            sz[nRet] = '\0';
            printf(sz);
        }
    }
    return 0;
}
阅读 1.4k
1 个回答

你如果只想发送一次,就只做一次 sendto 就好了啊,为什么要做循环发送呢?
因为是广播方式,一次 sendto 就会发给网段内所有的机器了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题