写一段 UDP 的广播发送和接收的示例
时间: 2023-09-29 22:10:08 浏览: 33
这是一段发送 UDP 广播的示例代码:
```
import socket
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 设置 socket 可以发送广播
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
# 发送广播消息
s.sendto(b'Hello World!', ('<broadcast>', 8000))
# 关闭 socket
s.close()
```
这是一段接收 UDP 广播的示例代码:
```
import socket
# 创建 socket 对象
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定到 8000 端口
s.bind(('', 8000))
# 接收数据
data, addr = s.recvfrom(1024)
print('Received message:', data.decode())
# 关闭 socket
s.close()
```
在这个示例中,我们创建了一个 UDP socket,设置了它可以发送广播,然后通过调用 `sendto` 函数发送广播消息。在另一个程序中,我们创建了另一个 UDP socket,绑定到 8000 端口,然后调用 `recvfrom` 函数接收数据。
相关问题
写一套c++windows下udp非阻塞发送和接收示例代码
好的,以下是一份简单的 C++ Windows 下 UDP 非阻塞发送和接收示例代码:
```c++
#include <iostream>
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma comment(lib, "Ws2_32.lib")
int main()
{
// 初始化 Winsock 库
WSADATA wsaData;
int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (result != 0) {
std::cerr << "WSAStartup failed: " << result << std::endl;
return 1;
}
// 创建 UDP 套接字
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET) {
std::cerr << "Failed to create socket: " << WSAGetLastError() << std::endl;
WSACleanup();
return 1;
}
// 设置套接字为非阻塞模式
u_long nonBlocking = 1;
if (ioctlsocket(sock, FIONBIO, &nonBlocking) != 0) {
std::cerr << "Failed to set non-blocking mode: " << WSAGetLastError() << std::endl;
closesocket(sock);
WSACleanup();
return 1;
}
// 绑定套接字到本地端口
sockaddr_in localAddr;
localAddr.sin_family = AF_INET;
localAddr.sin_port = htons(12345); // 绑定到端口 12345
localAddr.sin_addr.s_addr = INADDR_ANY;
if (bind(sock, reinterpret_cast<sockaddr*>(&localAddr), sizeof(localAddr)) == SOCKET_ERROR) {
std::cerr << "Failed to bind socket: " << WSAGetLastError() << std::endl;
closesocket(sock);
WSACleanup();
return 1;
}
// 发送数据
sockaddr_in destAddr;
destAddr.sin_family = AF_INET;
destAddr.sin_port = htons(12345);
inet_pton(AF_INET, "127.0.0.1", &destAddr.sin_addr); // 发送到本地回环地址
const char* message = "Hello, UDP!";
int messageLen = strlen(message);
int bytesSent = sendto(sock, message, messageLen, 0, reinterpret_cast<sockaddr*>(&destAddr), sizeof(destAddr));
if (bytesSent == SOCKET_ERROR) {
int error = WSAGetLastError();
if (error != WSAEWOULDBLOCK) {
std::cerr << "Failed to send data: " << error << std::endl;
closesocket(sock);
WSACleanup();
return 1;
}
} else {
std::cout << "Sent " << bytesSent << " bytes of data." << std::endl;
}
// 接收数据
char buffer[1024];
sockaddr_in srcAddr;
int srcAddrLen = sizeof(srcAddr);
int bytesReceived = recvfrom(sock, buffer, sizeof(buffer), 0, reinterpret_cast<sockaddr*>(&srcAddr), &srcAddrLen);
if (bytesReceived == SOCKET_ERROR) {
int error = WSAGetLastError();
if (error != WSAEWOULDBLOCK) {
std::cerr << "Failed to receive data: " << error << std::endl;
closesocket(sock);
WSACleanup();
return 1;
}
} else {
buffer[bytesReceived] = '\0';
std::cout << "Received " << bytesReceived << " bytes of data: " << buffer << std::endl;
}
// 关闭套接字并清理 Winsock 库
closesocket(sock);
WSACleanup();
return 0;
}
```
在本示例代码中,我们首先初始化了 Winsock 库,然后创建了一个 UDP 套接字,并将其设置为非阻塞模式。接着,我们将套接字绑定到本地端口,然后发送了一条 UDP 数据报到本地回环地址。最后,我们接收了一条 UDP 数据报,并将其输出到控制台。
需要注意的是,由于套接字被设置为非阻塞模式,所以在发送和接收数据时,我们需要检查返回值并根据返回值判断操作是否成功。如果返回值为 SOCKET_ERROR,则说明操作失败,此时我们需要通过 WSAGetLastError() 函数获取错误码,并根据错误码判断错误类型。如果错误类型为 WSAEWOULDBLOCK,则说明套接字处于非阻塞模式,暂时无法进行发送或接收操作,可以继续等待后续操作。
希望这份示例代码能对你有所帮助!
unity udp广播 发送和接收
要在Unity中实现UDP广播的发送和接收,可以使用C#中的Socket类,以下是一个示例代码:
```csharp
using System.Net;
using System.Net.Sockets;
using System.Text;
public class UdpBroadcastSender : MonoBehaviour
{
private const int PORT = 12345;
private UdpClient udpClient;
private void Start()
{
udpClient = new UdpClient();
udpClient.EnableBroadcast = true;
udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
udpClient.Client.Bind(new IPEndPoint(IPAddress.Any, PORT));
}
private void OnDestroy()
{
udpClient.Close();
}
public void SendMessage(string message)
{
byte[] data = Encoding.ASCII.GetBytes(message);
udpClient.Send(data, data.Length, new IPEndPoint(IPAddress.Broadcast, PORT));
}
}
public class UdpBroadcastReceiver : MonoBehaviour
{
private const int PORT = 12345;
private UdpClient udpClient;
private IPEndPoint ipEndPoint;
private void Start()
{
udpClient = new UdpClient(PORT);
ipEndPoint = new IPEndPoint(IPAddress.Any, PORT);
udpClient.EnableBroadcast = true;
udpClient.MulticastLoopback = true;
udpClient.JoinMulticastGroup(IPAddress.Broadcast);
udpClient.BeginReceive(new AsyncCallback(OnReceive), null);
}
private void OnDestroy()
{
udpClient.Close();
}
private void OnReceive(IAsyncResult result)
{
byte[] data = udpClient.EndReceive(result, ref ipEndPoint);
string message = Encoding.ASCII.GetString(data);
Debug.Log("Received message: " + message);
udpClient.BeginReceive(new AsyncCallback(OnReceive), null);
}
}
```
在以上代码中,UdpBroadcastSender类用来发送UDP广播消息,UdpBroadcastReceiver类用来接收UDP广播消息。在UdpBroadcastReceiver类中,我们使用了异步回调的方式来接收消息,这样可以保证在接收到消息之前不会阻塞主线程。
在Unity中,你可以将上述代码分别添加到两个不同的GameObject上,并在需要发送广播消息的时候调用UdpBroadcastSender.SendMessage函数即可。同时,在接收到广播消息时,UdpBroadcastReceiver.OnReceive函数会被自动调用,你可以在这个函数中处理接收到的消息。