客户端
/*
*Linux Socket广播包数据接收
*2019/12/21
*weixinhum
*/
#include <iostream>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>
int main()
{
//网络套接字创建函数,AF_INET指代IPv4协议,SOCK_DGRAM指代UDP协议,广播属于UDP协议
//第三个参数指定应用程序所使用的通信协议。在Internet通讯域中,此参数一般取值为0,系统会根据套接字的类型决定应使用的传输层协议。
int sock = socket(AF_INET, SOCK_DGRAM, 0);
if(sock < 0)
{
std::cout<<"create socket fail!\n"<<std::endl;
return -1;
}
//设置本地网络信息
struct sockaddr_in addr;
addr.sin_family = AF_INET;//设置IPv4协议
addr.sin_addr.s_addr = htonl(INADDR_ANY);//设置网址为本机
addr.sin_port = htons(2018);//这个端口要和广播方广播端口一致
//本地信息绑定到套接字中,相当于告诉套接字本机要接受数据
int ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
if(ret < 0)
{
std::cout<<"socket bind fail!\n"<<std::endl;
return -1;
}
//服务器端网络信息对象
struct sockaddr_in from;
socklen_t len = sizeof(from);
//接收数据对象初始化
int revlen;//返回接收数据长度
char buff[2000];//开辟返回数据存储空间
//不断接收数据
while (1)
{
revlen = recvfrom(sock, buff, 2000, 0, (struct sockaddr *)&from, &len);//接收数据
if (revlen > 0)
{
std::cout<<"recv:"<<revlen<<" from:"<<inet_ntoa(from.sin_addr)<<std::endl;
}
}
close(sock);//关闭网络套接字
return 0;
}