在Windows系统上用C++写一个UDP通信程序,分为客户端和服务端
时间: 2024-02-05 17:11:23 浏览: 71
QT中使用C++ socket通信 客户端与服务端的代码实例
5星 · 资源好评率100%
好的,以下是一个简单的UDP通信程序的示例,包括了客户端和服务端的代码:
服务端:
```cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#define BUF_SIZE 1024
#define PORT 8888
int main()
{
WSADATA wsaData;
SOCKET serv_sock;
SOCKADDR_IN serv_addr;
char buf[BUF_SIZE];
int str_len;
// 初始化Winsock库
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("WSAStartup() error!\n");
return -1;
}
// 创建UDP socket
serv_sock = socket(PF_INET, SOCK_DGRAM, 0);
if (serv_sock == INVALID_SOCKET)
{
printf("socket() error!\n");
WSACleanup();
return -1;
}
// 绑定socket
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(PORT);
if (bind(serv_sock, (SOCKADDR*)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR)
{
printf("bind() error!\n");
closesocket(serv_sock);
WSACleanup();
return -1;
}
// 接收数据
while (1)
{
str_len = recvfrom(serv_sock, buf, BUF_SIZE - 1, 0, NULL, 0);
if (str_len < 0)
{
printf("recvfrom() error!\n");
break;
}
buf[str_len] = '\0';
printf("Received message: %s\n", buf);
}
// 关闭socket
closesocket(serv_sock);
WSACleanup();
return 0;
}
```
客户端:
```cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#define BUF_SIZE 1024
#define PORT 8888
int main()
{
WSADATA wsaData;
SOCKET clnt_sock;
SOCKADDR_IN serv_addr;
char buf[BUF_SIZE];
int str_len;
// 初始化Winsock库
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("WSAStartup() error!\n");
return -1;
}
// 创建UDP socket
clnt_sock = socket(PF_INET, SOCK_DGRAM, 0);
if (clnt_sock == INVALID_SOCKET)
{
printf("socket() error!\n");
WSACleanup();
return -1;
}
// 设置服务器地址
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 服务器IP地址
serv_addr.sin_port = htons(PORT);
// 发送数据
while (1)
{
printf("Input a message: ");
scanf("%s", buf);
if (sendto(clnt_sock, buf, strlen(buf), 0, (SOCKADDR*)&serv_addr, sizeof(serv_addr)) == SOCKET_ERROR)
{
printf("sendto() error!\n");
break;
}
}
// 关闭socket
closesocket(clnt_sock);
WSACleanup();
return 0;
}
```
注意事项:
1. 代码中需要引入winsock2.h头文件,并链接ws2_32.lib库。
2. 服务端在接收到数据后,会一直等待下去,可以通过在客户端输入“exit”等命令来退出程序。
阅读全文