我编写了简单的转发代理服务器,它接受来自客户端的端口范围的连接并转发它们。
建立连接后,我将它们添加到我使用select()监视的套接字列表中。我知道更好的方法是使用read()和每个fd一个线程。
我有一些限制,因为我不能每个连接使用一个线程,因此使用select()。但后来我不知道客户是否关闭了连接,因为选择没有告诉我。有没有办法解决这个问题?
答案 0 :(得分:3)
当select()告诉你在放入读集的文件描述符上有一个事件时,你必须通过调用例如来读取数据。 read()或recv()。
如果read()返回0,则另一端已关闭其连接结束。 如果read()返回-1,则发生了一些错误,您必须检查errno以查看它是什么。如果errno是EAGAIN或EWOULDBLOCK,你应该只返回你的select()循环,否则你应该关闭套接字。
答案 1 :(得分:1)
当连接关闭时,套接字的select return read事件。关闭后,当您从套接字读取数据时,重新调整值为0。
使用select比使用每个连接的线程更好。您可以在延迟(每个线程的连接数更多)和资源使用(每个线程的连接数减少)之间选择自己的策略。
答案 2 :(得分:0)
select()的第四个参数采用文件描述符的位掩码来监视异常。将那些位设置为就像读取和/或写入一样,并在select返回后测试它们。如果已设置,则可以通过正常调用read()来检索错误。