一、服务端
#include <WinSock2.h>
#include <stdio.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
int main()
{
printf("UDP Server\n");
// 1、初始化网络库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
// 2、初始化套接字库
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
printf("WSAStartup errorNum = %d\n", GetLastError());
return err;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
printf("LOBYTE errorNum = %d\n", GetLastError());
WSACleanup();
return -1;
}
// 3、创建socket连接,AF_INET:表示ipv4协议
// SOCK_STREAM:表示TCP连接
// SOCK_DGRAM:表示UDP连接
SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET == sockSrv)
{
printf("socket errorno = %d\n", GetLastError());
return -1;
}
// 配置连接参数
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6001);
// 绑定端口
if (SOCKET_ERROR == bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR_IN)))
{
printf("bind errorno = %d\n", GetLastError());
return -1;
}
// 4、等待接收数据
SOCKADDR_IN addrCli; // 目的套接字的地址族
int len = sizeof(SOCKADDR_IN);
char recvBuf[100] = { 0 };
char sendBuf[100] = { 0 };
while (true)
{
recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR*)&addrCli, &len);
std::cout << recvBuf << std::endl;
sprintf_s(sendBuf, 100, "Ask:%s", recvBuf);
sendto(sockSrv, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)&addrCli, len);
}
// 5、关闭套接字
closesocket(sockSrv);
WSACleanup();
system("pause");
}
二、客户端
#include <WinSock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
#include <iostream>
#pragma comment(lib, "ws2_32.lib")
int main()
{
printf("UDP Client\n");
// 1、初始化网络库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
// 2、初始化套接字库
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
printf("WSAStartup errorNum = %d\n", GetLastError());
return err;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
{
printf("LOBYTE errorNum = %d\n", GetLastError());
WSACleanup();
return -1;
}
// 3、创建socket连接,AF_INET:表示ipv4协议
// SOCK_STREAM:表示TCP连接
// SOCK_DGRAM:表示UDP连接
SOCKET sockCli = socket(AF_INET, SOCK_DGRAM, 0);
if (INVALID_SOCKET == sockCli)
{
printf("socket errorno = %d\n", GetLastError());
return -1;
}
// 配置地址和端口
SOCKADDR_IN addrSrv;
memset(&addrSrv, 0, sizeof(addrSrv));
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6001);
// 假设我们有一个 IP 地址的字符串表示
const char* ip_str = "192.168.1.11";
if (inet_pton(AF_INET, ip_str, &(addrSrv.sin_addr.s_addr)) <= 0) {
// 错误处理
printf("inet_pton errorno = %d\n", GetLastError());
return -1;
}
// 发送数据
int len = sizeof(SOCKADDR_IN);
char sendBuf[100] = "我是你爹";
char recvBuf[100] = { 0 };
sendto(sockCli, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)&addrSrv, len);
// 接收数据
recvfrom(sockCli, recvBuf, 100, 0, (SOCKADDR*)&addrSrv, &len);
std::cout << recvBuf << std::endl;
// 5、关闭套接字
closesocket(sockCli);
WSACleanup();
system("pause");
}