C++网络编程-基于UDP的网络编程

服务端操作

  1. 创建服务器套接字(create)。
  2. 服务器套接字进行信息绑定(bind)。
  3. 开始数据传输(recvfrom/sendto)。
  4. 关闭套接字(close)。

客户端操作

  1. 创建服务器套接字(create)。
  2. 向服务器发送数据(sendto/recvfrom)。
  3. 关闭套接字(close)。

server.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h> //WindowsSocket编程头文件
#include<iostream>
#include<cstring>
#pragma comment(lib,"ws2_32.lib")//链接ws2_32.lib库文件到此项目中
using namespace std;

int main() {
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);//错误会返回WSASYSNOTREADY
if (err != 0) {
return 0;
}
if (LOBYTE(wsaData.wVersion) != 1 || //低字节为主版本
HIBYTE(wsaData.wVersion) != 1) //高字节为副版本
{
WSACleanup();
return 0;
}
printf("server is operating!\n\n");
//创建用于监听的套接字
SOCKET sockSer = socket(AF_INET, SOCK_DGRAM, 0);//失败会返回 INVALID_SOCKET
SOCKADDR_IN addrSer; //定义sockSrv发送和接收数据包的地址
addrSer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(6000);
//绑定套接字, 绑定到端口
bind(sockSer, (SOCKADDR*)&addrSer, sizeof(SOCKADDR));//会返回一个SOCKET_ERROR
//将套接字设为监听模式, 准备接收客户请求
SOCKADDR_IN addrClient; //用来接收客户端的地址信息
int len = sizeof(SOCKADDR);
char recvBuf[100]; //收
char sendBuf[100]; //发
char tempBuf[100]; //存储中间信息数据
while (1) {
//等待并数据
recvfrom(sockSer, recvBuf, 100, 0, (SOCKADDR*)&addrClient, &len);
if ('q' == recvBuf[0]) {
sendto(sockSer, "q", strlen("q") + 1, 0, (SOCKADDR*)&addrClient, len);
printf("Chat end!\n");
break;
}
sprintf_s(tempBuf, "%s say : %s", inet_ntoa(addrClient.sin_addr), recvBuf);
printf("%s\n", tempBuf);
//发送数据
printf("Please input data: \n");
gets_s(sendBuf);
sendto(sockSer, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)&addrClient, len);
}
closesocket(sockSer);
WSACleanup();
return 0;
}

client.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h> //WindowsSocket编程头文件
#include<iostream>
#include<cstring>
#pragma comment(lib,"ws2_32.lib")//链接ws2_32.lib库文件到此项目中
using namespace std;

int main() {
//加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(1, 1);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return 0;
}
if (LOBYTE(wsaData.wVersion) != 1 || //低字节为主版本
HIBYTE(wsaData.wVersion) != 1) //高字节为副版本
{
WSACleanup();
return 0;
}
printf("Client is operating!\n\n");
//创建用于监听的套接字
SOCKET sockSer = socket(AF_INET, SOCK_DGRAM, 0);
sockaddr_in addrSer;
addrSer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//输入你想通信的地址(此处是本机内部)
addrSer.sin_family = AF_INET;
addrSer.sin_port = htons(6000);
int len = sizeof(SOCKADDR);
char recvBuf[100]; //收
char sendBuf[100]; //发
char tempBuf[100]; //存储中间信息数据
while (1) {
printf("Please input data: \n");
gets_s(sendBuf);
sendto(sockSer, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)&addrSer, len);
//等待并数据
recvfrom(sockSer, recvBuf, 100, 0, (SOCKADDR*)&addrSer, &len);
if ('q' == recvBuf[0]) {
sendto(sockSer, "q", strlen("q") + 1, 0, (SOCKADDR*)&addrSer, len);
printf("Chat end!\n");
break;
}
sprintf_s(tempBuf, "%s say : %s", inet_ntoa(addrSer.sin_addr), recvBuf);
printf("%s\n", tempBuf);
//发送数据
}
closesocket(sockSer);
WSACleanup();
return 0;
}