CMakeLists.txt文件中添加如下行:
link_libraries(ws2_32)
1.发送端
#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.接收端代码
#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;
}
执行结果: