使用套接字 API 的 UDP
我的服务器使用UDP。它在获取后自动向我的程序发送900bytes/1ms。我在 Windows (VB6) 中使用套接字 API。我做了一个测试,我知道我的程序的消息处理时间(大约0.3ms)比循环时间(1ms)短。所以原因应该是socket内部缓冲区。我尝试调用setsockopt函数来设置更大的缓冲区:
setsockopt(SockNum, SOL_SOCKET, SO_RCVBUF, SockBuffer(1), 1048576)
但我仍然丢失了数据。我该如何解决我的问题? 我正在使用 recv
函数来接收数据。 recvfrom
应该更好吗?
此外,我需要为 UDP 创建一个 FIFO 缓冲区。我怎样才能做到这一点(即算法或示例)?
My server use UDP. It sends 900bytes/1ms to my program automatically after being acquired. I'm using socket API in Windows (VB6). I had made a test and I know that the message processing time (about 0.3ms) of my program is shorter than cycle time (1ms). So the cause should be socket internal buffer. I try calling setsockopt
function to set the bigger buffer:
setsockopt(SockNum, SOL_SOCKET, SO_RCVBUF, SockBuffer(1), 1048576)
but I still lost data. How can I fix my problem?
I'm using recv
function to receive data. Should recvfrom
be better?
Futhermore, I need make a FIFO buffer for UDP. How I can do so (i.e. algorithms or examples)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
在您的问题中,您似乎在抱怨使用 UDP 并丢失数据。
如果您使用 UDP,您将会丢失数据。避免丢失数据的方法是使用 TCP,而不是 UDP。如果您尝试采用用户数据报协议并向其中添加可靠的数据传输,您最终会得到具有 TCP 的所有流量控制和数据窗口的协议……只不过它不会实现得那么好你想要的。
请记住,“那些不理解 TCP 的人注定要重新发明它......很糟糕”
In your question you seem to be complaining about using UDP and losing data.
If you are using UDP, you are going to lose data. The way that you avoid losing data is to use TCP, not UDP. If you try to take the User Datagram Protocol and add reliable delivery of data to it, you will end up with something that has all of the flow-control and data windowing of TCP... except it won't be implemented as well as you want.
Remember, "Those who do not understand TCP are doomed to reinvent it.... poorly"