1、简述
UDP是无连接的,在UDP传输层中并没有客户端和服务端的概念。但是可以在应用层定义客户端和服务端,可以灵活的互换客户端和服务端,或者同时既是客户端也是服务端。
HP-Socket中在应用层定义了四种UDP组件:UdpClient、UdpServer、UdpCast、UdpNode
2、区别
1)UdpClient
UdpClient 是客户端的UDP,向服务器发送 UDP 数据包后等待接收响应。
2)UdpServer
UdpServer 是服务端的UDP,用于监听端口,接收来自多个客户端的 UDP 数据包,并可以向这些客户端发送响应。
3)UdpCast
UdpCast 是专用于 UDP 广播或组播的组件,和 UdpClient 类似继承自 IClient,本质也属于客户端。
4)UdpNode
UdpNode 是通用的 UDP 通信节点,没有客户端和服务端的概念,也可以认为既是客户端也是服务端
还可以实现广播和组播功能。
3、用法
3.1 UdpClient
基本用法
- 创建 UdpClient 实例。
- 调用 Start 方法启动客户端,并指定本地监听的 IP 和端口。
- 使用 Send 方法向服务器发送数据。
- 接收来自服务器的数据。
- 调用 Stop 方法停止客户端。
#include "HPSocket.h"
#include "SocketInterface.h"int main() {IUdpClient* pClient = CreateUdpClient();if (pClient->Start("0.0.0.0", 0)) {const char* serverAddress = "127.0.0.1";USHORT serverPort = 5555;const char* message = "Hello, Server!";pClient->Send(serverAddress, serverPort, (const BYTE*)message, strlen(message));}pClient->Stop();DestroyUdpClient(pClient);return 0;
}
3.2 UdpServer
基本用法
- 创建 UdpServer 实例。
- 实现一个监听器类,继承自 IUdpServerListener,并实现其方法,如 OnPrepareListen、OnReceive 等。
- 设置服务器的监听器。
- 调用 Start 方法启动服务器,并指定监听的 IP 和端口。
- 处理接收到的数据。
- 调用 Stop 方法停止服务器
#include "HPSocket.h"
#include "SocketInterface.h"class CListener : public CUdpServerListener {
public:virtual EnHandleResult OnReceive(IUdpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) {printf("Received: %s\n", pData);return HR_OK;}
};int main() {IUdpServer* pServer = CreateUdpServer();CListener listener;pServer->SetListener(&listener);if (pServer->Start("0.0.0.0", 5555)) {printf("Server started.\n");getchar(); // 等待输入,退出服务}pServer->Stop();DestroyUdpServer(pServer);return 0;
}
4、组播TTL和回环
1)TTL(Time To Live)即“生存时间”,用于指定数据包在网络中可以经过的最大路由器(跳数)数量。
- TTL = 0:数据包只能在本地机器上循环,不会被发送到任何网络。
- TTL = 1:数据包只能在同一子网内传输,不能跨越路由器。
- 较高的TTL值:如果TTL值更高,数据包可以跨越多个路由器,从而到达更远的网络。
2)loop(环回)
- 启用:发送的数据包可以被同一主机上的组播组成员接收。
- 禁用:发送的数据包不会被发送者所在的主机接收。