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(环回)
- 启用:发送的数据包可以被同一主机上的组播组成员接收。
- 禁用:发送的数据包不会被发送者所在的主机接收。
发表评论