我写了一个转发代理。我将它用于windows和linux。我确实需要根据操作系统进行更改。但是,我不断看到一些加薪条件。大多数情况下,我相信它们是由于我在猜测哪个是最后一个数据包(FIN sigal)时的误解。目前我确实选择了一组套接字。无论哪个套接字发出信号,我都会对其进行 read() 。如果 read 返回 0,那么我认为它是一个 FIN 数据包,然后我关闭该套接字。是否会发生我的 read() 给出非零值。但是该数据包确实包含 FIN(我认为它可能会发生)。因此,尽管某些套接字已关闭,但我不会关闭它们。我不确定代理如何检测哪个套接字已关闭?或者是已建立连接上的最后一个数据包。
我的代码如下所示:
我从客户那里接受了 100 个 fds。我将它们存储为一个数组sock_array[total_size]
。
select(copy_of_sock_array,timeout)
for(int cnt=0;cnt<total_size;cnt++)
{
if(FD_ISSET(sock_array[cnt],sock_array))
{
ret = recv(sock_array[cnt],buffer,len);
if(ret<=0){
/*This must be a FIN packet */
/* Close corresponding socket which is opened with outer world */
close(/*corresponding socket*/);
}
}
}
这看起来好吗?
谢谢