2012-05-26 88 views
0

我一直在围绕UDP进行定制以使其可靠。我有这个设计问题,我只有在我的整个程序准备就绪后才开始实现,并开始将数据包从源发送到接收器。可靠的UDP实现设计问题

场景: 我创建了一个接收数据包的单线程。父节点执行数据包发送作业。由于这只是一个POC,所以我将缓冲区和公共数据结构保存为全局指针,为其分配内存。我正在使用互斥关注关键内存部分。

作为可靠性的一部分,我发送一些控制数据包与数据包分开。在任何时候,客户端都会发送数据包并从服务器接收控制包,而服务器将接收数据包并发送控制包。我已经使用单个套接字,因为我的理解是发送& recv同时处理单个套接字和默认阻塞。

问题: 为了测试目的,我发送了100个数据包,从源到数据包。不幸的是,服务器端的线程忙不停地接收数据包并将其存储在缓冲区中。在父线程获取上下文切换之前,服务器代码不会将数据包传递给应用程序。这增加了整体通信中不可接受的延迟。

请帮我理解,这是什么问题;可以改变什么来改善性能?

由于提前,基达

+0

TCP可能比UDP更可靠。为什么你不能使用TCP/IP套接字? –

+0

要求适用于流式传输应用程序。 tcp将不太适合。 – KedarX

回答

1

由于您使用互斥体,当互斥报文后,在一个线程释放被发送,那么其他线程应该消耗的数据包。也许你不会很快释放互斥锁。

或者,让套接字的select()方法为您处理unblock-on-receive。

+0

我锁定并解锁每个数据包的互斥锁。它应该已经缓解了上下文? – KedarX

+0

是的,你可能在某个地方有bug。但是,如果你的套接字中的数据包具有特定的无效性,那么select()将为你做到这一点:http://rhoden.id.au/doc/sockets2.html –

+0

谢谢,这是有道理的。是否有可能保持单线程的相同体系结构,并且它是父级并仍然利用select?我在线程中接收和发送呼叫,并且只发送给父母。任何线索?谢谢。 – KedarX