美文网首页
UDP广播编程

UDP广播编程

作者: arkliu | 来源:发表于2022-12-06 09:24 被阅读0次

发送者

#include<netdb.h>
#include<sys/socket.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<memory.h>
#include<signal.h>
#include<arpa/inet.h>

int sockfd;

int main(int argc, char* argv[]) {
    if (argc < 3){
        printf("usage:%s ip port\n",argv[0]);
        exit(1);
    }

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0) {
        perror("socket error");
        exit(1);
    }
    int opt = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));

    struct sockaddr_in serveraddr;
    memset(&serveraddr, 0 , sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    inet_pton(AF_INET, argv[1], &serveraddr.sin_addr.s_addr);

    printf("i will broadcast...\n");
    char *info = "hello world";
    size_t  size = strlen(info) * sizeof(char);
    if(sendto(sockfd, info, size, 0,
                (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0) {
                    perror("send error");
                    exit(1);
    }
    return 0;
}

接收者

#include<netdb.h>
#include<sys/socket.h>
#include<unistd.h>
#include<stdlib.h>
#include<stdio.h>
#include<memory.h>
#include<signal.h>
#include<arpa/inet.h>

int sockfd;

void sig_handler(int sig_no) {
    if(sig_no == SIGINT) {
        printf("receiver will exited\n");
        close(sockfd);
        exit(1);
    }
}

int main(int argc, char* argv[]) {
    if (argc < 2){
        printf("usage:%s port\n",argv[0]);
        exit(1);
    }

    if(signal(SIGINT, sig_handler) == SIG_ERR) {
        perror("signal sigint err");
        exit(1);
    }

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd < 0) {
        perror("socket error");
        exit(1);
    }
    struct sockaddr_in serveraddr;
    memset(&serveraddr, 0 , sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[1]));
    serveraddr.sin_addr.s_addr = INADDR_ANY;

    if(bind(sockfd, (struct sockadr*)&serveraddr, sizeof(serveraddr)) < 0) {
        perror("bind error");
        exit(1);
    }

    char buffer[1024];
    struct sockaddr_in clientaddr;
    socklen_t len = sizeof(clientaddr);
    while(1) {
        memset(buffer, 0, sizeof(buffer));
        memset(&clientaddr, 0, sizeof(clientaddr));
        if(recvfrom(sockfd, buffer ,sizeof(buffer), 0,
                    (struct sockaddr*)&clientaddr, &len) <0) {
            perror("bind error");
            exit(1);
        } else {
            char ip[16];
            inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, ip, sizeof(ip));
            int port = ntohs(clientaddr.sin_port);
            printf("%s(%d):%s\n", ip,port, buffer);
        }
    }
    return 0;
}

发送者:


image.png

接收者:


image.png

相关文章

网友评论

      本文标题:UDP广播编程

      本文链接:https://www.haomeiwen.com/subject/xhjefdtx.html