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