关于 Socket 通信的缓冲池问题

2021-04-06 17:13:54 +08:00
 MekoPan

场景

现有大概 2000 多张图片采用 UDP 方式从客户端发送到服务器端,需要在服务器端显示

问题

发送的时间很短,在短时间内服务器端无法接受大量的数据(好像是 socket 自带的缓冲区不够?), 在 TCP 链接中可以采用

int conn = accept(m_socketfd, (struct sockaddr*)&m_servaddr, &len);
m_li.push_back(conn);

的方式缓存,但是在 UDP 模式下好像不支持 accept 函数, 问题是如何在 UDP 场景下,让服务器可以缓存从客户端发来的数据,并逐张显示图片.

吐槽

从进公司干到现在,已经干过了 java, golang, python. C++.美名曰算法工程师,其实就是个打杂的,我吐了.

2027 次点击
所在节点    C++
15 条回复
MekoPan
2021-04-06 17:32:43 +08:00
或者有没有其他思路解决传输大数据的问题
ahhui
2021-04-06 17:37:05 +08:00
udp 是不可靠的协议,在链路上,包括但不限于你的计算机-中间路由器-对方的计算机,任何一方缓存满了,新到的包都直接丢弃,你无法保证客户端能收到大量数据。如果需要收发大量数据,你需要实现自己的可靠传输方案。
ahhui
2021-04-06 17:39:08 +08:00
可以参考这些协议:UDT 、KCP 、QUIC 、uTP 、FASP 、SCTP
https://zhuanlan.zhihu.com/p/68466363
MekoPan
2021-04-06 17:41:20 +08:00
@ahhui 好的好的,谢谢老哥
ch2
2021-04-06 17:42:03 +08:00
udp 没有 accept,听起来你要实现的是 ftp over udp,工作量挺大的
hxndg
2021-04-06 17:44:59 +08:00
UDP 是不缓存吧,
而且讲道理你如果想做缓存需要在 UDP 上层做这个操作,别指望了 UDP 了
而且都用 SOCKET 了为啥不用 TCP 呢?

当然 TCP 也不能完全解决你的问题
neoblackcap
2021-04-06 17:45:18 +08:00
一般公司就不要考虑 SCTP 了,去看看 KCP 吧或者 QUIC 吧。那两个都挺好,挺成熟的
MekoPan
2021-04-06 17:48:21 +08:00
@hxndg 因为我要从其他地方接受数据,他们发送的方式是基于 UDP 的,我没得选择 T.T
MekoPan
2021-04-06 17:48:57 +08:00
@neoblackcap 主要明天要验收,现在改来不及了
MekoPan
2021-04-06 17:49:29 +08:00
@ch2 我改改看吧,实在不行只能放弃了
MekoPan
2021-04-06 17:53:59 +08:00
@ch2 如果是 2000 个坐标点数据,一个点一个点传输呢? 我自己测试的效果是,传输时间很短,但是我服务器接受之后只能接收到大概 300 多个数据.
toss156
2021-04-06 18:06:24 +08:00
用 kcp 在 udp 的基础上包一层就可以了,记得改大 kcp 窗口和 udp 发送缓冲区。kcp 来控制重传。
xmcy0011
2021-04-06 18:09:25 +08:00
你这个说的有点模糊啊,2000 张图片是同时传还是 1 个 1 个传。你要是同时传,服务器带宽都是问题吧?还有你有几台服务器?一台不够,分流啊,多搞几台。
ch2
2021-04-06 18:27:25 +08:00
@MekoPan #11 你每次传的时候要在数据前面加个 header,注明这是哪个文件的哪一块数据。不管是 tcp 还是 udp 在其之上再自定义传输格式才能保证你知道哪一块数据漏了要求客户端补上,不要指望不约定传输格式瞎发瞎收就能撞大运把数据传完整
araaaa
2021-04-06 19:02:33 +08:00
???并不适合用 udp 去做

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/768443

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX