一个最简单的UDP通信

贴在这里主要是做测试代码时直接从这里拷贝,省的一行行去写

服务器:

#include "stdafx.h"
#include "stdio.h"  
#include "Winsock2.h"  
#include "iostream"  
#include "string"  
#pragma comment(lib,"WS2_32.lib")

#define OK_STR "OK"  

void main()
{
	int version_a = 1;
	int version_b = 1;
	WORD versionRequest = MAKEWORD(version_a, version_b);
	WSAData wsaData;
	int err = WSAStartup(versionRequest, &wsaData);

	if (err != 0)
	{
		printf("ERROR!");
		return;
	}

	if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
	{
		printf("WRONG WINSOCK VERSION!");
		WSACleanup();
		return;
	}

	SOCKET socServer = socket(AF_INET, SOCK_DGRAM, 0);

	SOCKADDR_IN addr_Srv;
	addr_Srv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addr_Srv.sin_family = AF_INET;
	addr_Srv.sin_port = htons(28080);
	bind(socServer, (SOCKADDR*)&addr_Srv, sizeof(SOCKADDR));

	SOCKADDR_IN addr_Clt;
	char recvBuf[100];
	int fromlen = sizeof(SOCKADDR);

	while (true)
	{
		recvfrom(socServer, recvBuf, 100, 0, (SOCKADDR*)&addr_Clt, &fromlen);
		std::cout << recvBuf << ":" << addr_Clt.sin_port << std::endl;
		sendto(socServer, OK_STR, strlen(OK_STR) + 1, 0, (SOCKADDR*)&addr_Clt, sizeof(SOCKADDR));
	}
	closesocket(socServer);
	WSACleanup();
}


客户端:

#include "stdafx.h"
#include "Winsock2.h"  
#include "iostream"  
#include "stdio.h"  
#pragma comment(lib, "ws2_32.lib")  

void main()
{

	int version_a = 1;
	int version_b = 1;
	WORD versionRequest = MAKEWORD(version_a, version_b);
	WSAData wsaData;
	int error = WSAStartup(versionRequest, &wsaData);

	if (error != 0)
	{
		printf("ERROR!");
		return;
	}
	if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
	{
		printf("WRONG WINSOCK VERSION!");
		WSACleanup();
		return;
	}


	char requestStr[100];
	SOCKET socClient = socket(AF_INET, SOCK_DGRAM, 0);
	SOCKADDR_IN addrSrv;  
	addrSrv.sin_addr.S_un.S_addr = inet_addr("47.94.155.26");//47.94.155.26192.168.1.117
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(28080);

	char cRecvBuf[100];
	while (true)
	{
		std::cin >> requestStr;
		sendto(socClient, requestStr, strlen(requestStr) + 1, 0, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); 
		recv(socClient, cRecvBuf, strlen(cRecvBuf) + 1, 0);
		std::cout << cRecvBuf << std::endl;
	}

	closesocket(socClient);
	WSACleanup();

	//  return 0;  
}


### 回答1: 好的,下面是一个使用 Python 语言的 UDP 通信的程序的例子。 首先,我们可以使用 Python 内置的 `socket` 库来创建一个 UDP socket: ``` import socket # 创建 socket 对象 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 获取本地主机名 host = socket.gethostname() # 设置端口号 port = 12345 # 绑定端口 s.bind((host, port)) ``` 然后,我们可以使用 `recvfrom()` 函数来接收数据: ``` while True: # 接收数据 data, addr = s.recvfrom(1024) print("Received message: %s" % data.decode()) ``` 最后,我们可以使用 `sendto()` 函数来发送数据: ``` # 发送数据 message = "Hello, World!" s.sendto(message.encode(), (host, port)) ``` 完整的代码如下: ``` import socket # 创建 socket 对象 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 获取本地主机名 host = socket.gethostname() # 设置端口号 port = 12345 # 绑定端口 s.bind((host, port)) while True: # 接收数据 data, addr = s.recvfrom(1024) print("Received message: %s" % data.decode()) # 发送数据 message = "Hello, World!" s.sendto(message.encode(), (host, port)) ``` 希望这个例子对你有帮助。 ### 回答2: UDP(User Datagram Protocol)是一种无连接的传输协议,它在网络通信中具有较低的延迟和较小的数据包头开销。下面是一个基本的UDP通信的程序示例: 1. 引入必要的库和模块: ```python import socket ``` 2. 创建UDP Socket: ```python udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ``` 3. 绑定IP地址和端口: ```python local_ip = '127.0.0.1' #本地IP local_port = 8888 #本地端口 udp_socket.bind((local_ip, local_port)) ``` 4. 接收数据: ```python buffer_size = 1024 #接收缓冲区大小 while True: data, addr = udp_socket.recvfrom(buffer_size) #接收数据 print('接收到来自{}的数据:{}'.format(addr, data)) ``` 5. 发送数据: ```python remote_ip = '127.0.0.1' #目标IP remote_port = 9999 #目标端口 message = 'Hello, UDP!' #要发送的消息 udp_socket.sendto(message.encode(), (remote_ip, remote_port)) #发送消息 ``` 在上述代码中,我们创建了一个UDP Socket,并绑定了本地IP地址和端口。然后,程序进入一个循环中,不断接收来自其他主机的数据包,并打印出来。同时,我们也可以使用`sendto()`方法发送数据包给指定的目标IP地址和端口。 需要注意的是,UDP通信是无连接的,发送端发送的数据包可能会丢失,接收端也可能接收到重复的数据包。因此,在实际应用中,我们应该考虑处理丢失、重复和乱序的数据包。 ### 回答3: UDP(User Datagram Protocol)是一种无连接的、不可靠的传输协议,适用于对数据传输时延要求较低、实时性要求较高的场景。下面给出一个简单UDP通信的程序示例。 服务端程序: ```python import socket # 创建UDP socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定服务器IP和端口号 server_addr = ('127.0.0.1', 8888) server_socket.bind(server_addr) while True: # 接收客户端发送的数据 data, client_addr = server_socket.recvfrom(1024) print(f"Received message from {client_addr}: {data.decode()}") # 将接收到的消息转换为大写 upper_data = data.decode().upper() # 向客户端发送转换后的消息 server_socket.sendto(upper_data.encode(), client_addr) ``` 客户端程序: ```python import socket # 创建UDP socket对象 client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 服务器IP和端口号 server_addr = ('127.0.0.1', 8888) while True: # 从命令行获取用户输入 message = input("请输入消息:") # 发送消息到服务器 client_socket.sendto(message.encode(), server_addr) # 接收来自服务器的响应 response, server_addr = client_socket.recvfrom(1024) print(f"Received response from server: {response.decode()}") if message == "bye": break ``` 以上示例中,服务端创建了一个UDP socket并绑定到指定的IP地址和端口号,然后通过不断循环接收客户端发送的数据,在接收到消息后将其转换为大写,并发送回客户端。客户端程序通过UDP socket将用户输入的消息发送给服务器,并接收服务器的响应消息。当用户输入"bye"时,程序结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值