windows下c语言实现udp服务端收发
时间: 2023-10-22 10:20:01 浏览: 118
以下是一个简单的 Windows 下 C 语言实现 UDP 服务端的示例:
```c
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") // 链接 ws2_32.lib 库
#define BUF_SIZE 1024 // 接收缓冲区大小
int main()
{
WSADATA wsaData; // 用于初始化 Winsock 库
int ret = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (ret != 0) {
printf("WSAStartup error: %d\n", ret);
return 1;
}
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // 创建 UDP 套接字
if (sock == INVALID_SOCKET) {
printf("socket error: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}
struct sockaddr_in servAddr; // 服务端地址信息
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY); // 任意 IP 地址
servAddr.sin_port = htons(12345); // 指定端口号
ret = bind(sock, (struct sockaddr*)&servAddr, sizeof(servAddr)); // 绑定到本地地址
if (ret == SOCKET_ERROR) {
printf("bind error: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
char buf[BUF_SIZE]; // 接收缓冲区
int addrLen = sizeof(struct sockaddr_in); // 地址信息长度
while (1) {
memset(buf, 0, BUF_SIZE); // 清空接收缓冲区
struct sockaddr_in clntAddr; // 客户端地址信息
ret = recvfrom(sock, buf, BUF_SIZE, 0, (struct sockaddr*)&clntAddr, &addrLen); // 接收数据
if (ret == SOCKET_ERROR) {
printf("recvfrom error: %d\n", WSAGetLastError());
break;
}
printf("Received message from %s:%d\n", inet_ntoa(clntAddr.sin_addr), ntohs(clntAddr.sin_port));
printf("Message: %s\n", buf);
ret = sendto(sock, buf, strlen(buf) + 1, 0, (struct sockaddr*)&clntAddr, addrLen); // 将数据原样返回客户端
if (ret == SOCKET_ERROR) {
printf("sendto error: %d\n", WSAGetLastError());
break;
}
}
closesocket(sock);
WSACleanup();
return 0;
}
```
代码中使用了 Winsock 库来实现 UDP 通信,所以需要链接 `ws2_32.lib` 库。`WSAStartup()` 函数用于初始化 Winsock 库。`socket()` 函数创建一个 UDP 套接字。`bind()` 函数将套接字绑定到本地地址。`recvfrom()` 函数用于接收数据。`sendto()` 函数用于发送数据。`closesocket()` 函数用于关闭套接字。`WSACleanup()` 函数用于清理 Winsock 库。
阅读全文