广播的实现

//
//  main.c
//  broadcastclient
//
//  Created by 吴珝君 on 2019/5/20.
//  Copyright © 2019年 闲着也是贤者. All rights reserved.
//

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <ctype.h>
#define SERVER_PORT 8000
#define MAXLINE 4096
#define CLIENT_PORT 9000

int main(int argc, char *argv[])
{
    struct sockaddr_in localaddr,serveraddr;
    int confd;
    ssize_t len;
    char buf[MAXLINE];
    char str[1024];
    socklen_t s;
    //1.创建一个socket
    confd = socket(AF_INET, SOCK_DGRAM, 0);
    //2.初始化本地端地址
    bzero(&localaddr, sizeof(localaddr));
    localaddr.sin_family = AF_INET;
    inet_pton(AF_INET, "172.29.142.165" , &localaddr.sin_addr.s_addr);
    localaddr.sin_port = htons(CLIENT_PORT);
    
    int ret = bind(confd, (struct sockaddr *)&localaddr, sizeof(localaddr));  //显示绑定不能省略
    if (ret == 0)
        printf("...bind ok...\n");
    
    while (1) {
        s = sizeof(struct sockaddr);
        len = recvfrom(confd, buf, sizeof(buf), 0, (struct sockaddr *)(& serveraddr), &s);//说明这个变量占用空间
        printf("received from %s at PORT %d\n",
               inet_ntop(AF_INET, &serveraddr.sin_addr, str, sizeof(str)),
               ntohs(serveraddr.sin_port));
     
       sendto(confd, buf, len, 0, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
        write(STDOUT_FILENO, buf, len);
    }
    close(confd);
    
    return 0;
}

//
//  main.c
//  broadcastserver
//
//  Created by 吴珝君 on 2019/5/20.
//  Copyright © 2019年 闲着也是贤者. All rights reserved.
//

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <net/if.h>

#define SERVER_PORT 8000                                    /* 无关紧要 */
#define MAXLINE 1500

#define BROADCAST_IP "172.29.142.165"
#define CLIENT_PORT 9000                                    /* 重要 */

int main(void)
{
    int sockfd;
    struct sockaddr_in serveraddr, clientaddr;
    char buf[MAXLINE];
    int len =0;
    /* 构造用于UDP通信的套接字 */
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    socklen_t s;
    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;                        /* IPv4 */
    inet_pton(AF_INET, "172.29.142.165" , &serveraddr.sin_addr.s_addr);       /* 本地任意IP INADDR_ANY = 0 */
    serveraddr.sin_port = htons(SERVER_PORT);
    bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
    
    int flag = 1;
    setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &flag, sizeof(flag));//注意说明这个值到底设么含义
    
    /*构造 client 地址 IP+端口  192.168.7.255+9000 */
    bzero(&clientaddr, sizeof(clientaddr));
    clientaddr.sin_family = AF_INET;
    inet_pton(AF_INET, BROADCAST_IP, &clientaddr.sin_addr.s_addr);
    clientaddr.sin_port = htons(CLIENT_PORT);
    
    int i = 0;
    while (1) {
        sprintf(buf, "helloworld ,小吴同学\n", i++);
        //fgets(buf, sizeof(buf), stdin);
        sendto(sockfd, buf, strlen(buf), 0, (struct sockaddr *)&clientaddr, sizeof(clientaddr));
        s = sizeof(serveraddr);
       len = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)(& serveraddr), &s);
        //sendto(confd, buf, strlen(buf), 0, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
        write(STDOUT_FILENO, buf, len);
        
        
        sleep(1);
    }
    close(sockfd);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值