UDP协议是无连接的数据传输协议,客户端在向服务端发送数据时,不需要建立连接,可以直接发送数据。
服务端和客户端程序的创建流程如下:
服务端代码如下:
#include<iostream>
#include<WinSock2.h>
#include<WS2tcpip.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
int err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return -1;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return -1;
}
//1 创建套接字
//UDP采用的是ram流
SOCKET sockSrv = socket(AF_INET,SOCK_DGRAM, 0);
//2 将套接字绑定到一个本地地址和端口上
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(ADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
//3 等待并接收数据
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
char recvBuf[100];
//接收数据的函数是recvform
recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR*)&addrClient, &len);
cout << "接收的数据为:" << recvBuf << endl;
//4 关闭套接字
closesocket(sockSrv);
WSACleanup();
getchar();
return 0;
}
客户端代码如下:
#include<iostream>
#include<WinSock2.h>
#include<WS2tcpip.h>
using namespace std;
#pragma comment(lib,"ws2_32.lib")
int main()
{
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(1, 1);
int err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return -1;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return -1;
}
//1 创建套接字
SOCKET sockCli = socket(AF_INET,SOCK_DGRAM, 0);
//2 发送数据
//不需要建立连接
SOCKADDR_IN addrSrv;
inet_pton(AF_INET, "127.0.0.1", &addrSrv.sin_addr);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
char sendBuf[100] = "huanhuncao";
sendto(sockCli, sendBuf, strlen(sendBuf) + 1, 0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
//3 关闭套接字
closesocket(sockCli);
WSACleanup();
getchar();
return 0;
}
先运行服务端,然后运行客户端,运行结果如下: