3/15 UDP多点通信 并发服务器

一、UDP多点通信

  1. 广播的发送端(类似客户端)

#include
#include 
#include 
#include 
#include 
#include 
#include 

#define ERR_MSG(msg) do{\
    fprintf(stderr,"line:%d\n", __LINE__);\
    perror(msg);\
}while(0)

#define PORT 6666               //1024~49151
#define IP  "192.168.31.255"    //IP地址,广播IP

int main(int argc, const char *argv[])
{
    //创建报式套接字
    int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }
    printf("socket create success sfd = %d __%d__\n", sfd, __LINE__);

    //设置允许广播
    int reuse = 1;
    if(setsockopt(sfd, SOL_SOCKET, SO_BROADCAST, &reuse, sizeof(reuse)) < 0)
    {
        ERR_MSG("setsockopt");
        return -1;
    }
    printf("broadcast success __%d__\n", __LINE__);

    //绑定---->非必须绑定
    //如果不绑定,操作系统会自动绑定本机IP,从49152~65535范围内随机一个未被使用的端口号
    
    //填充接收端的地址信息结构体
    //供给下面的sendto使用
    struct sockaddr_in sin;
    sin.sin_family         = AF_INET;        //必须填AF_INET
    sin.sin_port         = htons(PORT);    //服务器绑定的端口,网络字节序
    sin.sin_addr.s_addr = inet_addr(IP);    //服务器绑定的IP,广播IP
    
    char buf[128] = "";
    ssize_t res = 0;

    while(1)
    {
        bzero(buf, sizeof(buf));
        //发送数据
        printf("请输入>>> ");
        fgets(buf, sizeof(buf), stdin);
        buf[strlen(buf)-1] = '\0';

        //发送给服务器,所以上面的代码,需要填充好服务器的地址信息结构体
        //想要发送给谁,就填谁的地址信息结构体
        if(sendto(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&sin, sizeof(sin)) < 0)
        {
            ERR_MSG("sendto");
            return -1;
        }
        printf("发送成功\n");
    }

    //关闭所有文件描述符
    close(sfd);
    return 0;
}
  1. 广播的接收端(类似服务器)

#include
#include 
#include 
#include 
#include 
#include 
#include 

#define ERR_MSG(msg) do{\
    fprintf(stderr,"line:%d\n", __LINE__);\
    perror(msg);\
}while(0)

#define PORT 6666               //1024~49151
#define IP  "192.168.31.255"    //IP地址,广播IP

int main(int argc, const char *argv[])
{
    //创建报式套接字
    int sfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sfd < 0)
    {
        ERR_MSG("socket");
        return -1;
    }
    printf("socket create success sfd = %d __%d__\n", sfd, __LINE__);

    //填充服务器自身的地址信息结构体 AF_INET : man 7 IP
    struct sockaddr_in sin;
    sin.sin_family         = AF_INET;         //必须填AF_INET
    sin.sin_port         = htons(PORT);     //服务器绑定的端口,网络字节序
    sin.sin_addr.s_addr = inet_addr(IP);  //服务器绑定的IP,广播IP

    //绑定---->必须绑定
    if(bind(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
    {
        ERR_MSG("bind");
        return -1;
    }
    printf("bind success __%d__\n", __LINE__);

    char buf[128] = "";

你可能感兴趣的:(开发语言,算法)