精易论坛

标题: TCP粘包问题dome,有好多问题,那个大佬能完善一下 [打印本页]

作者: 408089597    时间: 2023-7-17 22:15
标题: TCP粘包问题dome,有好多问题,那个大佬能完善一下
今天遇到了TCP粘包问题,想了一下就写了一个dome,但是写的时候发现有好多问题,

现基本粘包已经解决,那个大佬能完善一下,或者发一个例子




1.png (44.41 KB, 下载次数: 0)

1.png

服务器.e

895.86 KB, 下载次数: 19, 下载积分: 精币 -2 枚

客户.e

2.72 KB, 下载次数: 23, 下载积分: 精币 -2 枚


作者: 1051130978    时间: 2023-7-17 22:59
别用官方支持库,用hp_socket
作者: 408089597    时间: 2023-7-17 23:26
现在就是我想怎么不用现在一直循环处理的情况下,怎么可以在数据不完整的时候阻塞连接一直等待数据发过来! 不然我这样岂不是一千个连接就是一千个线程?,其实还一个一个办法,就是每一个连接申请一个内存,当数据过来的时候吧数据纯在内存,并且处理一下数据,数据不够的就先放在内存里边等待再次有数据过来然后合并处理,连接断开的时候释放内存
作者: 396384183    时间: 2023-7-18 00:02
感谢分享
作者: 408089597    时间: 2023-7-18 00:10
刚想到一个思路去掉线程,简单测试不丢包,不粘包,但是懒得写线程取处理以及共享资源安全了

2.png (56.94 KB, 下载次数: 0)

2.png

服务器.e

134.05 KB, 下载次数: 1, 下载积分: 精币 -2 枚


作者: 遗失的眼泪    时间: 2023-7-18 00:33
这个时候我要说一句 hp_socket 天下第一

易语言的组件长年不更新,没必要用它们了(UI组件除外)

作者: Svlik    时间: 2023-7-18 01:34
HP挺不错的 但是有个大问题。就是如果你使用HP库  其他的平台 如PHP HTML 使用 原生库 就无法连接。
作者: pipicool    时间: 2023-7-18 04:00
学习一下
作者: xo37    时间: 2023-7-18 08:31
dome  or demo?
作者: 一指温柔    时间: 2023-7-18 08:34
谢谢分享
作者: wuqingg    时间: 2023-7-18 08:48
早~~~~~~~~~~~~~~~·
作者: 亿万    时间: 2023-7-18 21:42
谢谢分享
作者: bianyuan456    时间: 2023-7-20 09:55
已经顶贴,感谢您对论坛的支持!
作者: qmxun    时间: 2023-7-20 11:01
你这是自己发自己收,如果是别的软件发你收出现粘包怎么整
作者: 408089597    时间: 2023-7-20 11:44
qmxun 发表于 2023-7-20 11:01
你这是自己发自己收,如果是别的软件发你收出现粘包怎么整

一般都指的是自己的客户Duan和服务端,如果真有需求要收别的客户Duan发的数据,发生粘包,就抓一下包,看一下他的格式是什么取修改服务端了。
作者: accet    时间: 2023-7-20 16:39
直接用ETCP打开配套模式就行了 不需要自己处理了 HPPack模式也是一样.
作者: accet    时间: 2023-7-20 16:43
Svlik 发表于 2023-7-18 01:34
HP挺不错的 但是有个大问题。就是如果你使用HP库  其他的平台 如PHP HTML 使用 原生库 就无法连接。 ...

用正常模式就行了. 或是 PULL模式就行了.

PACK模式 那是在TCP上重新定义自己的一套。 当然需要两边都是PACK模式了.
作者: Svlik    时间: 2023-7-20 19:20
accet 发表于 2023-7-20 16:43
用正常模式就行了. 或是 PULL模式就行了.

PACK模式 那是在TCP上重新定义自己的一套。 当然需要两边都是P ...

PULL模式是不是需要自己分包?
作者: accet    时间: 2023-7-21 04:06
Svlik 发表于 2023-7-20 19:20
PULL模式是不是需要自己分包?

当是需要自己分包.
PULL模式是已经帮你组包了. 分包就看你的自己的了.
网络传输 各地的路由器 规则不同 自然会可能被 粘包 分包.
而且PULL线程安全. 我写的模拟器都是用PULL搞的.

PACK模式 则是不需要自己处理组包分包了 内部帮你做了 你看不到.
但是PACK模式 必需两边都是PACK.
他其实就是 比如你发送的是 0x11223344 他会帮你在网络中按 0x0400000011223344 传过去.
而对方收到后 根据 04000000知道本轮传输长度为4.就取出后面的 11223344 去回调你的HPPACK模式的接收函数 OnRecv.. Recv的参数就有 11223344 的内存地址和长度.

作者: gmkk2e    时间: 2023-7-21 14:40
qmxun 发表于 2023-7-20 11:01
你这是自己发自己收,如果是别的软件发你收出现粘包怎么整

所有的都会处理粘包情况
作者: 曽祥冠    时间: 2023-7-22 01:58
别用自带的服务端组件和客户Duan组件了,改用API创建或者用HP吧,自带的服务端组件不好分类客户机,就算写好了客户分类也会影响到效率,看了你写的服务端代码,接收数据函数里面开始几行竟然有多线程通行证?先不说你能不能同时接收上千上万个客户Duan链接的数据接收,10个客户Duan的数据接收都慢的要死,因为你在最关键的地方使用了通行证。建议你改用API创建或者用HP吧,或者随便在论坛下载个API创建带粘包处理的代码都比你这强啊
作者: 408089597    时间: 2023-7-22 13:03
曽祥冠 发表于 2023-7-22 01:58
别用自带的服务端组件和客户Duan组件了,改用API创建或者用HP吧,自带的服务端组件不好分类客户机,就算写 ...

是的,我这只是随便写的一个demo,根本没有考虑这些
作者: shuya1    时间: 2023-8-4 01:35
支持开源~!感谢分享
作者: senyu239    时间: 2024-7-28 01:07
感谢分享,很给力!~
作者: JYYeah    时间: 2025-2-10 22:08
        感谢分享,很给力!~
作者: shuya1    时间: 2025-4-19 09:48
支持开源~!感谢分享




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4