4.33、广播

4.33、广播

  • 1.广播的介绍
  • 2.广播代码编写
    • ①服务端
    • ②客户端

1.广播的介绍

向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊的IP地址,这个IP中子网内主机标志部分的二进制全部为1,也就是ip地址的最后一位为xxx.xxx.xxx.255

  • a: 只能在局域网中使用。
  • b: 客户端需要绑定服务器广播使用的端口,才可以接收到广播消息。

需要设置允许广播的属性

// 设置广播属性的函数
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);
	- sockfd : 文件描述符
	- level : SOL_SOCKET
	- optname : SO_BROADCAST
	- optval : int类型的值,为1表示允许广播
	- optlen : optval的大小

4.33、广播_第1张图片

2.广播代码编写

①服务端

#include 
#include 
#include 
#include 

using namespace std;

int main() {

    // 创建通信使用的文件描述符
    int client_fd = socket(PF_INET, SOCK_DGRAM, 0);
    if (client_fd == -1) {
        perror("socket");
        exit(-1);
    }

    // 允许发送广播数据报
    int opval = 1;  // 1表示同意发送,0表示不同意发送
    setsockopt(client_fd, SOL_SOCKET, SO_BROADCAST, &opval, sizeof(opval));

    // 设置广播ip
    sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(9999);
    inet_pton(AF_INET, "xxx.xxx.xxx.255", &addr.sin_addr.s_addr);

    // 进行通信
    char sendBuf[128];
    int num = 0;
    while (1) {
        
        sprintf(sendBuf, "hello client, data: %d", num ++ );

        cout << sendBuf << endl;

        sendto(client_fd, sendBuf, strlen(sendBuf) + 1, 0, (sockaddr *)&addr, sizeof(addr));

        sleep(1);
    }

    close(client_fd);

    return 0;
}

②客户端

#include 
#include 
#include 
#include 

using namespace std;

int main() {

    // 创建通信使用的文件描述符
    int server_fd = socket(AF_INET, SOCK_DGRAM, 0);

    // 绑定当前主机的ip和端口,因为需要接受消息
    sockaddr_in client_addr;
    client_addr.sin_family = AF_INET;
    client_addr.sin_port = htons(9999);
    client_addr.sin_addr.s_addr = INADDR_ANY;

    bind(server_fd, (sockaddr *)&client_addr, sizeof(client_addr));


    // 接收数据
    char recvBuf[128];

    while (1) {

        recvfrom(server_fd, recvBuf, sizeof(recvBuf), 0, NULL, NULL);

        printf("I am client, my recv data: %s\n", recvBuf);

    }

    close(server_fd);
    
    return 0;
}

你可能感兴趣的:(网络)