C++ UDP发送和接收vector<int>变长数组报文

该代码示例展示了如何使用Winsock2库通过UDP协议发送和接收vector<int>数据。首先,发送端发送vector的大小信息,然后发送实际数据。接收端接收到大小信息后,创建相应大小的vector来接收数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

总体思想:需要先发一条包含vector元素个数的报文,好在接收端定义一个同样大小的vector来接收发送过来的数据。然后再发送vector数组中的内容。

1.发送端代码

#ifndef UNICODE
#define UNICODE
#endif

#include <winsock2.h>
#include <cstdio>
#include <vector>

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

using namespace std;

int main() {

    int iResult1;
    int iResult;
    WSADATA wsaData;

    SOCKET SendSocket = INVALID_SOCKET;
    sockaddr_in RecvAddr;

    unsigned short Port = 27015;

    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    //----------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %d\n", iResult);
        return 1;
    }

    //---------------------------------------------
    // Create a socket for sending data
    SendSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (SendSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //---------------------------------------------
    // Set up the RecvAddr structure with the IP address of
    // the receiver (in this example case "127.0.0.1")
    // and the specified port number.
    RecvAddr.sin_family = AF_INET;
    RecvAddr.sin_port = htons(Port);
    RecvAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

    //---------------------------------------------
    // Send a datagram to the receiver

    int length=v.size();

    wprintf(L"Sending a datagram to the receiver...\n");
    iResult1 = sendto(SendSocket, (char*)&length, sizeof(int), 0, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
    iResult = sendto(SendSocket, (char*)v.data(), sizeof(int)*(v.size()), 0, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));

    printf("sizeof(int)*(v.size())=%d\n",sizeof(int)*(v.size()));
    printf("iResult=%d\n",iResult);
    printf("iResult1=%d\n",iResult1);

    if (iResult == SOCKET_ERROR) {
        wprintf(L"sendto failed with error: %d\n", WSAGetLastError());
        closesocket(SendSocket);
        WSACleanup();
        return 1;
    }
    //---------------------------------------------
    // 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"close socket failed with error: %d\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //---------------------------------------------
    // Clean up and quit.
    wprintf(L"Exiting.\n");
    WSACleanup();
    return 0;
}

2.接收端代码

#ifndef UNICODE
#define UNICODE
#endif

#include <winsock2.h>
#include <cstdio>
#include <vector>

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

using namespace std;

int main() {

    int iResult = 0;
    int iResult1 = 0;

    WSADATA wsaData;

    SOCKET RecvSocket;
    sockaddr_in RecvAddr;

    unsigned short Port = 27015;

    sockaddr_in SenderAddr;
    int SenderAddrSize = sizeof(SenderAddr);

    //-----------------------------------------------
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error %d\n", iResult);
        return 1;
    }
    //-----------------------------------------------
    // Create a receiver socket to receive datagrams
    RecvSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (RecvSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error %d\n", WSAGetLastError());
        return 1;
    }
    //-----------------------------------------------
    // Bind the socket to any address and the specified port.
    RecvAddr.sin_family = AF_INET;
    RecvAddr.sin_port = htons(Port);
    RecvAddr.sin_addr.s_addr = htonl(INADDR_ANY);

    iResult = bind(RecvSocket, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr));
    if (iResult != 0) {
        wprintf(L"bind failed with error %d\n", WSAGetLastError());
        return 1;
    }
    //-----------------------------------------------
    // Call the recvfrom function to receive datagrams
    // on the bound socket.
    wprintf(L"Receiving datagrams...\n");

    int length=0;
    iResult1 = recvfrom(RecvSocket, (char*)&length, sizeof(int), 0, (SOCKADDR *) &SenderAddr, &SenderAddrSize);
    printf("length=%d\n", length);
    vector<int> v(length);
    iResult = recvfrom(RecvSocket, (char*)v.data(), sizeof(int)*v.size(), 0, (SOCKADDR *) &SenderAddr, &SenderAddrSize);
    printf("iResult=%d\n", iResult);
    printf("iResult1=%d\n", iResult1);
    printf("v[0]=%d\n", v[0]);
    printf("v[1]=%d\n", v[1]);
    printf("v[2]=%d\n", v[2]);
    printf("sizeof(int) * (v.size())=%d\n", sizeof(int) * (v.size()));

    if (iResult == SOCKET_ERROR) {
        wprintf(L"recvfrom failed with error %d\n", WSAGetLastError());
    }
//printf("%s\n",RecvBuf);
//-----------------------------------------------
// 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());
        return 1;
    }

//-----------------------------------------------
// Clean up and exit.
    wprintf(L"Exiting.\n");

    WSACleanup();

    return 0;
}

3.接收端运行打印效果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值