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