UDP 单播

1. Linux 服务端

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define BUF_SIZE 88
#define PORT     55555

int main(int argc, char *argv[])
{
    //建立套接字
    int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);           //IPV4,数据报套接字类型,不指定协议

    //说明本服务器地址
    const struct sockaddr_in srvaddr = {
        .sin_family = AF_INET,                              //协议类型IPV4
        .sin_port = htons(PORT),                            //端口号-网络字节序
        .sin_addr.s_addr = htonl(INADDR_ANY)                //IP地址-任意地址
    };

    //绑定地址
    bind(sock_fd, (const struct sockaddr *)&srvaddr, sizeof(srvaddr));

    //接收数据
    char buf[BUF_SIZE] = { 0 };
    struct sockaddr_in cliaddr;
    socklen_t cliaddrlen = sizeof(cliaddr);
    while (1)
    {
        bzero(buf, BUF_SIZE);
        bzero(&cliaddr, cliaddrlen);

        recvfrom(sock_fd, buf, BUF_SIZE, 0, (struct sockaddr *)&cliaddr, &cliaddrlen);

        fprintf(stdout, "Recv from [%s - %hu]:%s",
            inet_ntoa(cliaddr.sin_addr),
            ntohs(cliaddr.sin_port),
            buf);
    }

    //关闭套接字
    close(sock_fd);

    return 0;
}

2. Linux 客户端

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <errno.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>

#define BUF_SIZE 88
#define PROT     55555
#define ADDR     "192.168.4.194"

int main(int argc, char *argv[])
{
    //建立套接字
    int sock_fd = socket(AF_INET, SOCK_DGRAM, 0);           //IPV4,数据报套接字类型,不指定协议

    //声明将连接地址
    const struct sockaddr_in  srvaddr = {
        .sin_family = AF_INET,                              //协议类型IPV4
        .sin_port = htons(PROT),                            //端口号-网络字节序
        .sin_addr.s_addr = inet_addr(ADDR)                  //IP地址-字符串转IP
    };

    //发送数据
    char buf[BUF_SIZE] = { 0 };
    while (1)
    {
        bzero(buf, BUF_SIZE);

        fprintf(stdout, "Say something: ");
        if (fgets(buf, BUF_SIZE, stdin) == NULL)
            break;

        sendto(sock_fd, buf, strlen(buf), 0, (const struct sockaddr*)&srvaddr, sizeof(srvaddr));
    }

    //关闭套接字
    close(sock_fd);

    return 0;
}

3. Windows 客户端

#include <stdio.h>
#include <WinSock2.h>
#pragma comment( lib, "ws2_32.lib")

#define BUF_SIZE 88
#define PROT     55555
#define ADDR     "192.168.4.194"

int main(int argc, char *argv[])
{
    //初始化SOCKET
    WSADATA wsaData;
    int err = WSAStartup(MAKEWORD(1, 1), &wsaData);
    if (err != 0)
    {
        return -1;
    }

    if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
    {
        WSACleanup();
        return -1;
    }

    //建立套接字
    SOCKET sock_fd = socket(AF_INET, SOCK_DGRAM, 0);        //IPV4,数据报套接字类型,不指定协议

    //声明将连接地址
    SOCKADDR_IN srvaddr = {
        .sin_family = AF_INET,                              //协议类型IPV4
        .sin_port = htons(PROT),                            //端口号-网络字节序
        .sin_addr.s_addr = inet_addr(ADDR)                  //IP地址-字符串转IP
    };

    //发送数据
    char buf[BUF_SIZE] = { 0 };
    while (1)
    {
        memset(buf, 0, BUF_SIZE);

        fprintf(stdout, "Say something: ");
        if (fgets(buf, BUF_SIZE, stdin) == NULL)
            break;

        sendto(sock_fd, buf, strlen(buf), 0, (const struct sockaddr*)&srvaddr, sizeof(srvaddr));
    }

    //关闭套接字
    closesocket(sock_fd);

    return 0;
}

4. 测试效果

客户端
这里写图片描述

服务端
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值