C++ 实现简单Udp服务器

使用C++基于windows平台下实现Udp服务器

main.cpp

#include <winsock2.h>
#include <WS2tcpip.h>
#include <iostream>

using namespace  std;

//添加动态库的lib
#pragma comment(lib, "ws2_32.lib")

//UDP服务端
int  main() {

	//初始化winsock2环境
	WSADATA  wd;
	if(WSAStartup(MAKEWORD(2, 2), &wd) != 0) {
		cout << "WSAStartup error:" << GetLastError() << endl;
		return 0;
	}

	//1.创建UDP数据报套接字
	SOCKET  s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if(s == INVALID_SOCKET) {
		cout << "socket  error:" << GetLastError() << endl;
		return 0;
	}

	//2.绑定到Ip地址和端口
	sockaddr_in  addr;
	addr.sin_family = AF_INET;
	addr.sin_port = htons(8889);//网络字节序
	//addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
	//addr.sin_addr.s_addr = inet_addr("127.0.0.1");//s_addr是个宏
	inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);//ip地址转网络字节序

	int len = sizeof(SOCKADDR);
	if(bind(s, (SOCKADDR*)&addr, len) == SOCKET_ERROR) {
		cout << "bind error:" << GetLastError() << endl;
		return 0;
	}

	int nNetTimeout = 5000; //5秒
	//接收时限
	if(setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int)) == SOCKET_ERROR) {
		cout << "setsockopt error:" << GetLastError() << endl;
		return 0;
	}

	//3.接受或者发送数据recvfrom, sendto ,不同于TCP的 recv与 send
	int   ret = 0;
	do {
		//接受客户端的地址
		sockaddr_in  addrClient;
		memset(&addrClient, 0, sizeof(addrClient));
		int len = sizeof(SOCKADDR);//要赋值结构体的长度

		char buf[100] = { 0 };
		//默认是阻塞的,也就是说,如果没有数据过来,会一直等待
		ret = recvfrom(s, buf, 100, 0, (SOCKADDR*)&addrClient, &len);
		cout << "recvfrom " << ret << ":    " << buf << endl;

		//字节使用上面的客户端地址
		char *str = "I am Server!";
		ret = sendto(s, str, strlen(str), 0, (SOCKADDR*)&addrClient, len);

	} while(ret != SOCKET_ERROR  &&  ret != 0);

	//4.关闭套接字
	closesocket(s);


	//清理winsock2环境
	WSACleanup();


	return 0;
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的多线程UDP服务器C++代码示例: ```c++ #include <iostream> #include <thread> #include <cstring> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> using namespace std; void handle_client(int sockfd, sockaddr_in client_addr) { char buffer[1024]; int n; socklen_t len = sizeof(client_addr); while (true) { // 从客户端接收数据 n = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_addr, &len); if (n < 0) { perror("recvfrom"); exit(1); } // 打印客户端发送的数据 cout << "Received message from client: " << buffer << endl; // 发送响应数据给客户端 n = sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr*)&client_addr, len); if (n < 0) { perror("sendto"); exit(1); } } } int main() { int sockfd, portno; struct sockaddr_in serv_addr, client_addr; // 创建套接字 sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); exit(1); } // 初始化服务器地址 bzero((char*)&serv_addr, sizeof(serv_addr)); portno = 12345; // 服务器端口号 serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = INADDR_ANY; serv_addr.sin_port = htons(portno); // 绑定套接字到服务器地址 if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) < 0) { perror("bind"); exit(1); } cout << "Server is running on port " << portno << endl; while (true) { // 从客户端接收数据 char buffer[1024]; int n; socklen_t len = sizeof(client_addr); n = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&client_addr, &len); if (n < 0) { perror("recvfrom"); exit(1); } // 打印客户端发送的数据 cout << "Received message from client: " << buffer << endl; // 创建新线程处理客户端请求 thread t(handle_client, sockfd, client_addr); t.detach(); } // 关闭套接字 close(sockfd); return 0; } ``` 该程序使用了一个无限循环,不断接收来自客户端的请求,并为每个请求创建一个新线程来处理。当客户端连接时,服务器会从客户端接收数据,并将其输出到控制台。然后,服务器将相同的数据发送回客户端。注意,该程序没有任何安全特性,只是一个基本的示例程序。在实际应用中,您应该添加安全性和错误处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值