UDP单播

CMakeLists.txt文件中添加如下行:

link_libraries(ws2_32)

1.发送端

cpp 复制代码
#include <iostream>
#include <winsock2.h>
#include <cstdio>

#pragma comment(lib, "Ws2_32.lib")  // Link with ws2_32.lib

int main() {
     1.Initialize winsock
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

     2.Create a socket for sending data
    SOCKET SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (SendSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %1d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

     3.Set up the RecvAddr structure with the IP address of the receiver (in this example case "192.168.1.1")
     and the specified port number.
    sockaddr_in RecvAddr = {0};
    unsigned short Port = 27015;
    RecvAddr.sin_family = AF_INET;
    RecvAddr.sin_port = htons(Port);
    RecvAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

     4.Send a datagram to the receiver
    wprintf(L"Sending a datagram to the receiver...\n");
    char sendBuf[1024]="Hello";
    int BufLen = 1024;
    iResult = sendto(SendSocket, sendBuf, BufLen, 0, reinterpret_cast<SOCKADDR *>(&RecvAddr), sizeof(RecvAddr));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"sendto failed with error: %d\n", WSAGetLastError());
        closesocket(SendSocket);
        WSACleanup();
        return 1;
    }

     5.When the application is finished sending, close the socket.
    wprintf(L"Finished sending. Closing socket. \n");
    iResult = closesocket(SendSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

     6.Clean up and quit.
    wprintf(L" Exiting.\n");
    WSACleanup();
    return 0;
}

2.接收端代码

cpp 复制代码
#include <iostream>
#include <winsock2.h>
#include <cstdio>

#pragma comment(lib, "Ws2_32.lib")  // Link with ws2_32.lib

int main() {
     1.Initialize winsock
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

     2.Create a receiver socket to receive datagrams
    SOCKET RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (RecvSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %1d\n", WSAGetLastError());
        return 1;
    }

     3.Bind the socket to any address and the specified port.
    sockaddr_in RecvAddr = {0};
    unsigned short Port = 27015;
    RecvAddr.sin_family = AF_INET;
    RecvAddr.sin_port = htons(Port);
    RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);

    iResult=bind(RecvSocket,reinterpret_cast<SOCKADDR*>(&RecvAddr), sizeof(RecvAddr));
    if (iResult != 0) {
        wprintf(L"bind failed with error: %d\n", WSAGetLastError());
        return 1;
    }

     4.Call the recvfrom function to receive datagrams on the bound socket.
    wprintf(L"Receiving datagrams...\n");
    char RecvBuf[1024];
    int RecvAddrSize=sizeof(RecvAddr);
    iResult = recvfrom(RecvSocket, RecvBuf, sizeof(RecvBuf), 0, reinterpret_cast<SOCKADDR *>(&RecvAddr), &RecvAddrSize);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"recvfrom failed with error: %d\n", WSAGetLastError());
    } else{
        printf("%s\n",RecvBuf);
    }

     5.Close the socket when finished receiving datagrams
    wprintf(L"Finished receiving. Closing socket. \n");
    iResult = closesocket(RecvSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

     6.Clean up and quit.
    wprintf(L" Exiting.\n");
    WSACleanup();
    return 0;
}

执行结果:

相关推荐
十五年专注C++开发17 分钟前
Asio2: 一个基于 Boost.Asio 封装的高性能网络编程库
网络·c++·boost·asio·asio2
gcfer19 分钟前
CS144 中的C++知识积累
c++·右值引用·智能指针·optional容器
牛奶咖啡131 小时前
解决配置虚拟网络后同网段的设备网络不通问题
网络·桥接模式·主机模式·配置虚拟网络后同网段设备不通·排查解决同网段同网关网络不通·重置windows主机网络·nas模式
Bona Sun1 小时前
单片机手搓掌上游戏机(二十)—pico运行doom之编译环境
c语言·c++·单片机·游戏机
车载测试工程师2 小时前
CAPL学习-ETH功能函数-通用函数
网络·学习·tcp/ip·capl·canoe
ICT技术最前线2 小时前
sdwan组网软件如何帮助企业提升网络效率?
网络·sdwan·宽带组网
Albert Edison2 小时前
【项目设计】C++ 高并发内存池
数据结构·c++·单例模式·哈希算法·高并发
我真不会起名字啊2 小时前
C、C++中的sprintf和stringstream的使用
java·c语言·c++
猿饵块2 小时前
ros2--图像/image
c++
老蒋新思维3 小时前
创客匠人洞察:AI 时代 IP 变现的认知重构,从流量焦虑到价值深耕的破局之道
网络·人工智能·tcp/ip·重构·知识付费·创始人ip·创客匠人