[toc]

用C语言在windows中使用UDP协议发送文本消息

1.用C语言在windows中使用UDP协议发送一句文本消息

1.使用C语言在windows中创建服务端程序接收一句文本消息

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
59
60
61
62
63
64
65
66
67
68
69
70
//WinServer.c
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "WS2_32.lib")

#define BUF_SIZE 256

int main() {
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in serverAddr, clientAddr;
char buffer[BUF_SIZE];
int clientAddrLen = sizeof(clientAddr);

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 UDP 套接字
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET) {
printf("Socket creation failed. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 填充服务器地址信息
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8888); // 监听端口
serverAddr.sin_addr.s_addr = INADDR_ANY; // 监听所有可用的接口

// 绑定套接字到地址
if (bind(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
printf("Bind failed. Error Code: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}

printf("UDP server is listening on port 8888...\n");

// 循环接收消息
while (1) {
int recvLen = recvfrom(sock, buffer, BUF_SIZE, 0, (struct sockaddr*)&clientAddr, &clientAddrLen);
if (recvLen == SOCKET_ERROR) {
printf("Receive failed. Error Code: %d\n", WSAGetLastError());
break;
}

// 将接收到的消息以 null 结尾
buffer[recvLen] = '\0';

// 打印接收到的消息
char clientIP[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &clientAddr.sin_addr, clientIP, sizeof(clientIP));
printf("Received message from %s:%d\n", clientIP, ntohs(clientAddr.sin_port));
printf("%s", buffer);
}

// 关闭套接字
closesocket(sock);
WSACleanup();
return 0;
}

2.使用C语言在windows中创建客户端程序发送一句文本消息

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
59
60
61
62
63
//WinClient.c
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>

#pragma comment(lib, "WS2_32.lib")

#define BUF_SIZE 256

int main() {
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in serverAddr;
char message[BUF_SIZE];

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 UDP 套接字
sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET) {
printf("Socket creation failed. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 填充目标地址信息
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(8888); // 目标端口

// 使用 inet_pton 替代 inet_addr
if (inet_pton(AF_INET, "127.0.0.1", &serverAddr.sin_addr) <= 0) {
printf("Invalid address/ Address not supported \n");
closesocket(sock);
WSACleanup();
return 1;
}

// 输入要发送的消息
printf("Enter message to send: ");
fgets(message, BUF_SIZE, stdin);

// 发送消息
int sendResult = sendto(sock, message, strlen(message), 0, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
if (sendResult == SOCKET_ERROR) {
printf("Send failed. Error Code: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}

printf("Message sent: %s\n", message);

// 关闭套接字
closesocket(sock);
WSACleanup();
return 0;
}

3.运行结果

  1. 运行WinServer.exe
  2. 运行WinClient.exe
  3. 运行成功

2.用C语言在windows中使用UDP协议多次发送文本消息

1.使用C语言在windows中创建服务端程序多次接收文本消息

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
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库

int main() {
WSADATA wsaData;
SOCKET serverSocket;
struct sockaddr_in server, client;
int clientSize;
char buffer[1024];
int recvSize;

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 socket
serverSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (serverSocket == INVALID_SOCKET) {
printf("Could not create socket. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 设置服务器信息
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY; // 监听所有可用的接口
server.sin_port = htons(8888); // 服务器端口

// 绑定 socket
if (bind(serverSocket, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
printf("Bind failed. Error Code: %d\n", WSAGetLastError());
closesocket(serverSocket);
WSACleanup();
return 1;
}

printf("Waiting for incoming messages...\n");

clientSize = sizeof(client);
// 接收消息
while (1) {
recvSize = recvfrom(serverSocket, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&client, &clientSize);
if (recvSize == SOCKET_ERROR) {
printf("Receive failed. Error Code: %d\n", WSAGetLastError());
break;
}

buffer[recvSize] = '\0'; // 添加字符串结束符
char clientIP[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &client.sin_addr, clientIP, sizeof(clientIP)); // 使用 inet_ntop
printf("Received message from %s:%d: %s\n", clientIP, ntohs(client.sin_port), buffer);
}

// 关闭 socket
closesocket(serverSocket);
WSACleanup();
return 0;
}

2.使用C语言在windows中创建客户端程序多次发送文本消息

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
59
60
61
62
63
64
65
66
67
68
69
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库

int main() {
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in server;
char message[1024];
int sendResult;

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 socket
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == INVALID_SOCKET) {
printf("Could not create socket. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 设置服务器信息
server.sin_family = AF_INET;
server.sin_port = htons(8888); // 服务器端口

// 使用 inet_pton 将 IP 地址转换为网络字节顺序
if (inet_pton(AF_INET, "127.0.0.1", &server.sin_addr) <= 0) {
printf("Invalid address/ Address not supported \n");
closesocket(sock);
WSACleanup();
return 1;
}

// 发送多条消息
while (1) {
printf("Enter message (type 'exit' to quit): ");
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = 0; // 去掉换行符

// 检查是否退出
if (strcmp(message, "exit") == 0) {
break;
}

// 发送消息
sendResult = sendto(sock, message, strlen(message), 0, (struct sockaddr*)&server, sizeof(server));
if (sendResult == SOCKET_ERROR) {
printf("Send failed. Error Code: %d\n", WSAGetLastError());
break;
}
else {
printf("Message sent: %s\n", message);
}
}

// 关闭 socket
closesocket(sock);
WSACleanup();
return 0;
}

3.运行结果

  1. 运行WinServer.exe

  2. 运行WinClient.exe

  3. 运行成功

3.用C语言在windows中使用UDP协议客户端退出后可以再次连接服务器

1.使用C语言在windows中创建服务端程序断开后等待客户端连接

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
59
60
61
62
63
64
65
66
67
68
// WinServer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库

int main() {
WSADATA wsaData;
SOCKET serverSocket;
struct sockaddr_in server, client;
int clientSize;
char buffer[1024];
int recvSize;

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 socket
serverSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (serverSocket == INVALID_SOCKET) {
printf("Could not create socket. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 设置服务器信息
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY; // 监听所有可用的接口
server.sin_port = htons(8888); // 服务器端口

// 绑定 socket
if (bind(serverSocket, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
printf("Bind failed. Error Code: %d\n", WSAGetLastError());
closesocket(serverSocket);
WSACleanup();
return 1;
}

printf("Waiting for incoming messages...\n");
clientSize = sizeof(client);

// 循环接收消息
while (1) {
// 接收消息
recvSize = recvfrom(serverSocket, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&client, &clientSize);
if (recvSize == SOCKET_ERROR) {
printf("Receive failed. Error Code: %d\n", WSAGetLastError());
continue;
}

buffer[recvSize] = '\0'; // 添加字符串结束符
char clientIP[INET_ADDRSTRLEN]; // 用于存储客户端 IP 地址
inet_ntop(AF_INET, &client.sin_addr, clientIP, sizeof(clientIP)); // 使用 inet_ntop
printf("Received message from %s:%d: %s\n", clientIP, ntohs(client.sin_port), buffer);
}

// 关闭服务器 socket
closesocket(serverSocket);
WSACleanup();
return 0;
}

2.使用C语言在windows中创建客户端程序退出后再次连接服务端

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
59
60
61
62
63
64
65
66
67
68
69
// WinClient.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库

int main() {
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in server;
char message[1024];
int sendResult;

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 socket
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == INVALID_SOCKET) {
printf("Could not create socket. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 设置服务器信息
server.sin_family = AF_INET;
server.sin_port = htons(8888); // 服务器端口

// 使用 inet_pton 将 IP 地址转换为网络字节顺序
if (inet_pton(AF_INET, "127.0.0.1", &server.sin_addr) <= 0) {
printf("Invalid address/ Address not supported \n");
closesocket(sock);
WSACleanup();
return 1;
}

// 发送多条消息
while (1) {
printf("Enter message (type 'exit' to quit): ");
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = 0; // 去掉换行符

// 检查是否退出
if (strcmp(message, "exit") == 0) {
break;
}

// 发送消息
sendResult = sendto(sock, message, strlen(message), 0, (struct sockaddr*)&server, sizeof(server));
if (sendResult == SOCKET_ERROR) {
printf("Send failed. Error Code: %d\n", WSAGetLastError());
break;
} else {
printf("Message sent: %s\n", message);
}
}

// 关闭 socket
closesocket(sock);
WSACleanup();
return 0;
}

3.运行结果

  1. 运行WinServer.exe

  2. 运行WinClient.exe

  3. 运行成功

4.用C语言在windows中使用UDP协议让客户端与服务端相互发送文本消息

1.使用C语言在windows中创建服务端接收文本消息后再发送到客户端

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
59
60
61
62
63
64
65
66
67
68
69
70
71
// WinServer.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库

int main() {
WSADATA wsaData;
SOCKET serverSocket;
struct sockaddr_in server, client;
int clientSize;
char buffer[1024];
int recvSize;

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 socket
serverSocket = socket(AF_INET, SOCK_DGRAM, 0);
if (serverSocket == INVALID_SOCKET) {
printf("Could not create socket. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 设置服务器信息
server.sin_family = AF_INET;
server.sin_addr.s_addr = INADDR_ANY; // 监听所有可用的接口
server.sin_port = htons(8888); // 服务器端口

// 绑定 socket
if (bind(serverSocket, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR) {
printf("Bind failed. Error Code: %d\n", WSAGetLastError());
closesocket(serverSocket);
WSACleanup();
return 1;
}

printf("Waiting for incoming messages...\n");
clientSize = sizeof(client);

// 循环接收消息
while (1) {
// 接收消息
recvSize = recvfrom(serverSocket, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&client, &clientSize);
if (recvSize == SOCKET_ERROR) {
printf("Receive failed. Error Code: %d\n", WSAGetLastError());
continue;
}

buffer[recvSize] = '\0'; // 添加字符串结束符
char clientIP[INET_ADDRSTRLEN]; // 用于存储客户端 IP 地址
inet_ntop(AF_INET, &client.sin_addr, clientIP, sizeof(clientIP)); // 使用 inet_ntop
printf("Received message from %s:%d: %s\n", clientIP, ntohs(client.sin_port), buffer);

// 发送回客户端
sendto(serverSocket, buffer, recvSize, 0, (struct sockaddr*)&client, clientSize);
}

// 关闭服务器 socket
closesocket(serverSocket);
WSACleanup();
return 0;
}

2.使用C语言在windows中创建客户端程序接收与发送文本消息

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// WinClient.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib") // 链接 Winsock 库

int main() {
WSADATA wsaData;
SOCKET sock;
struct sockaddr_in server;
char message[1024];
char buffer[1024];
int sendResult, recvSize;

// 初始化 Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("Failed to initialize Winsock. Error Code: %d\n", WSAGetLastError());
return 1;
}

// 创建 socket
sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == INVALID_SOCKET) {
printf("Could not create socket. Error Code: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 设置服务器信息
server.sin_family = AF_INET;
server.sin_port = htons(8888); // 服务器端口

// 使用 inet_pton 将 IP 地址转换为网络字节顺序
if (inet_pton(AF_INET, "127.0.0.1", &server.sin_addr) <= 0) {
printf("Invalid address/ Address not supported \n");
closesocket(sock);
WSACleanup();
return 1;
}

// 发送和接收消息
while (1) {
printf("Enter message (type 'exit' to quit): ");
fgets(message, sizeof(message), stdin);
message[strcspn(message, "\n")] = 0; // 去掉换行符

// 检查是否退出
if (strcmp(message, "exit") == 0) {
break;
}

// 发送消息
sendResult = sendto(sock, message, strlen(message), 0, (struct sockaddr*)&server, sizeof(server));
if (sendResult == SOCKET_ERROR) {
printf("Send failed. Error Code: %d\n", WSAGetLastError());
break;
} else {
printf("Message sent: %s\n", message);
}

// 接收来自服务器的消息
recvSize = recvfrom(sock, buffer, sizeof(buffer) - 1, 0, NULL, NULL);
if (recvSize > 0) {
buffer[recvSize] = '\0'; // 添加字符串结束符
printf("Received from server: %s\n", buffer);
} else if (recvSize == SOCKET_ERROR) {
printf("Receive failed. Error Code: %d\n", WSAGetLastError());
break;
}
}

// 关闭 socket
closesocket(sock);
WSACleanup();
return 0;
}

3.运行结果

  1. 运行WinServer.exe

  2. 运行WinClient.exe

  3. 运行成功

5.用C语言在windows中使用UDP协议让两个客户端之间可以相互发送文本消息(unsuccess)

1.使用C语言在windows中创建服务端接收与转发文本消息到所有客户端中

1

2.使用C语言在windows中创建客户端程序接收与发送文本消息

1

3.运行结果

  1. 运行WinServer.exe

  2. 运行WinClient.exe

  3. 运行

6.用C语言在windows中使用UDP协议与ipv6协议发送一句文本消息

1.使用C语言在windows中使用ipv6地址创建服务端程序

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib")

#define PORT "8080" // 服务器端口
#define BUF_SIZE 1024 // 缓冲区大小

int main() {
WSADATA wsaData;
struct addrinfo hints, * res;
SOCKET sockfd;
struct sockaddr_storage client_addr;
socklen_t addr_len = sizeof(client_addr);
char buffer[BUF_SIZE];
int recvResult;

// 初始化Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed: %d\n", WSAGetLastError());
return 1;
}

// 设置addrinfo结构
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET6; // 使用IPv6
hints.ai_socktype = SOCK_DGRAM; // UDP
hints.ai_flags = AI_PASSIVE; // 服务器使用

// 获取地址信息
if (getaddrinfo(NULL, PORT, &hints, &res) != 0) {
printf("getaddrinfo failed: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 创建socket
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sockfd == INVALID_SOCKET) {
printf("socket failed: %d\n", WSAGetLastError());
freeaddrinfo(res);
WSACleanup();
return 1;
}

// 绑定socket
if (bind(sockfd, res->ai_addr, (int)res->ai_addrlen) == SOCKET_ERROR) {
printf("bind failed: %d\n", WSAGetLastError());
closesocket(sockfd);
freeaddrinfo(res);
WSACleanup();
return 1;
}

freeaddrinfo(res); // 释放addrinfo结构

printf("UDP Server is listening on port %s...\n", PORT);

// 接收消息
while (1) {
recvResult = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&client_addr, &addr_len);
if (recvResult == SOCKET_ERROR) {
printf("recvfrom failed: %d\n", WSAGetLastError());
continue;
}

buffer[recvResult] = '\0'; // 添加字符串结束符
printf("Received message: %s\n", buffer);

// 发送回客户端
sendto(sockfd, buffer, recvResult, 0, (struct sockaddr*)&client_addr, addr_len);
}

// 关闭socket
closesocket(sockfd);
WSACleanup();
return 0;
}

2.使用C语言在windows中使用ipv6地址创建客户端程序

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>

#pragma comment(lib, "ws2_32.lib")

#define PORT "8080" // 服务器端口
#define SERVER_ADDR "::1" // 服务器地址(本地IPv6地址)
#define BUF_SIZE 256 // 缓冲区大小

int main() {
WSADATA wsaData;
struct addrinfo hints, * res;
SOCKET sockfd;
const char* message = "Hello, UDP Server!";
int sendResult;

// 初始化Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
printf("WSAStartup failed: %d\n", WSAGetLastError());
return 1;
}

// 设置addrinfo结构
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET6; // 使用IPv6
hints.ai_socktype = SOCK_DGRAM; // UDP
hints.ai_flags = 0;

// 获取服务器地址信息
if (getaddrinfo(SERVER_ADDR, PORT, &hints, &res) != 0) {
printf("getaddrinfo failed: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}

// 创建socket
sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (sockfd == INVALID_SOCKET) {
printf("socket failed: %d\n", WSAGetLastError());
freeaddrinfo(res);
WSACleanup();
return 1;
}

// 发送消息
sendResult = sendto(sockfd, message, (int)strlen(message), 0, res->ai_addr, (int)res->ai_addrlen);
if (sendResult == SOCKET_ERROR) {
printf("sendto failed: %d\n", WSAGetLastError());
closesocket(sockfd);
WSACleanup();
return 1;
}

printf("Message sent: %s\n", message);

// 接收来自服务器的消息
char buffer[BUF_SIZE];
struct sockaddr_storage from_addr;
socklen_t addr_len = sizeof(from_addr);
int recvResult = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0, (struct sockaddr*)&from_addr, &addr_len);
if (recvResult > 0) {
buffer[recvResult] = '\0'; // 添加字符串结束符
printf("Received from server: %s\n", buffer);
}
else {
printf("recvfrom failed: %d\n", WSAGetLastError());
}

// 关闭socket
closesocket(sockfd);
WSACleanup();
return 0;
}

3.运行结果

  1. 运行WinServer.exe

  2. 运行WinClient.exe

  3. 运行成功