2013-04-04 78 views
0

我有来自多个simultaneos插座libev套接字通信失败

我使用的recv()从插座接收消息获取消息的基于libev套接字服务器。和send()向插座 沟通的问题是,有时候即使我做了send()和发送的输出()> 0 仍然对对方的套接字接收任何

的剥离下来代码的版本在这里 http://pastebin.com/SM7uPkVD

(大部分是从网上剪切粘贴)

的问题是socket通信工作精绝时代的99%,这只是一些地方这失败。 是否有一些明显的东西我缺少

回答

0

当使用SOCK_STREAM套接字时,不能保证多次发送导致多次接收。特别是,您的服务器可能会在第124行中一次读取多个合并请求,然后在第135行中只回复一次,导致您认为数据丢失。您应该检查readlen > 3是否验证。

+0

是否有没有缓冲区的实现。使用其他流。因此,每次写入和读取都将分开处理 – Ram 2013-04-04 11:57:08

+0

这种情况发生的原因很多:降低IPC开销。与其试图避免它,你应该通过分割来自大量接收数据的多个请求来利用它。这可以通过搜索一个请求结束标记(将\ n \ r'做些什么?),在每个请求前加上它的大小,或者简单地说,通过具有固定大小的请求来完成。 – jop 2013-04-04 12:39:43

+0

如果我的数据大小保证很小(小于1kb),并且我也可以控制它,那么执行read()或recv()的最佳方法是什么。我应该每次读1个字符查找“\ r”来结束覆盖或将发送程序更改为固定宽度的前缀 – Ram 2013-04-04 13:25:49