Debian64bits。
以为我理解了套接字的含义,但没有。
担心慢客户的管理。
阅读并摆弄该代码epoll edge triggered
想象两个客户: 答:网络很慢 B:非常快的网络。
在边沿触发模式下,当我们从A开始读取时会发生什么,然后当我们处于A的读取循环时,B还会发送一些数据进行读取?
B必须等待我们读取来自A的所有数据吗?
或者我们应该创建一个缓冲区(不是在给定的示例中)来存储A数据并连接它们直到消息完成并立即返回?
那个缓冲区已经由epoll管理了吗?
我不清楚潜在的基础......
答案 0 :(得分:3)
如果网络速度很慢,只要读取到目前为止已到达服务器的所有数据,读取部分就会停止。
虽然有一个错误(或至少是一个可移植性问题)。代码仅在读取数据时检查EAGAIN
。它还应检查EWOULDBLOCK
,因为一些平台在读取所有数据后返回该错误代码。
修改强>
好的,如果我想将传入的数据放入数据库,我该如何管理呢?我能读取整个数据吗?
如果您收到不完整的消息,则需要将其存储,直到收到整个消息。对于每个带有消息片段的传入连接,我会malloc
char*
。
当邮件完成后,您可以处理它,将其存储在数据库中或任何您想要的内容。
请注意,下一条消息的开头可能已经可用,因此在获得EWOULDBLOCK
或EAGAIN
之前,您无法停止阅读。
处理问题的另一种方法是为每个连接创建一个单独的线程。 哪个approcah最好?那么,这取决于应用程序(同时用户数等)。