在编程前要加入一个链接库ws2_32.lib
VC2017的操作步骤:
在解决方案的窗口中对项目点右键或者点击菜单栏中的项目
选择属性 - 连接器 - 输入 - 附加依赖性中添加ws2_32.lib,注意每一项要用 ; 来分隔
服务器端:
1、创建一个套接字(socket)
2、将套接字绑定到一个地址上(bind)
因此这一步之前要创建一个SOCKADDR_IN类型的结构体来存储地址和端口
3、等待并接受数据(recvform)
4、关闭套接字
客户端:
1、创建一个套接字(socket)
2、发送数据(sendto)
3、关闭套接字
UDP不需要建立连接,直接发送与接受数据即可。
// 服务器端
#include "pch.h"
#include <iostream>
#include <WinSock2.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return -1;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return -1;
}
SOCKET sockSrv = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);//除了family都要转换成网络字节顺序
//把本地地址及端口和套接字绑定
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
char recvbuf[100];
//等待直到获取到数据,获取数据的地址为 addrClient。
//因为没有建立连接,所以直接在接受数据,接受其地址信息和地址长度信息一起进行,
recvfrom(sockSrv, recvbuf, sizeof(recvbuf), 0, (SOCKADDR*)&addrClient, &len);
std::cout << recvbuf << std::endl;
closesocket(sockSrv);
WSACleanup();
return 0;
}
// 客户端
#include "pch.h"
#include <iostream>
#include <WinSock2.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return -1;
}
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
return -1;
}
SOCKET sockClient = socket(AF_INET, SOCK_DGRAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
//发送数据到 addrSrv
sendto(sockClient, "Hello!", strlen("Hello!") + 1, 0, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
closesocket(sockClient);
WSACleanup();
return 0;
}