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

总体思想:需要先发一条包含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.接收端运行打印效果

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值