【问题标题】:Closing sockets inside proxy关闭代理内部的套接字
【发布时间】:2012-08-16 23:29:50
【问题描述】:

我在 linux 中实现了一个转发代理,它侦听几个端口。每当发生连接时,它就会进入外部世界。 我的设置如下:

Outerworld代理(监听端口A)浏览器(配置代理设置为端口A)

但是,我不确定何时关闭代理外部世界和代理浏览器之间的连接。 我的印象是,如果我看到一个数据大小为 0 (recv()) 的数据包,那么它就是来自客户端的通信结束。一旦我得到“recv()=0”,我就会对外部世界做“close()”。这是正确的做法吗?还是我应该做shutdown()?另外,我认为有时浏览器会发送一个带有数据包的“FIN”,但我无法捕捉到它。我有时会在从未关闭的套接字上看到来自浏览器的连接。 (Linux 重复使用相同的 fd 编号。这是原因之一,我相信我缺少套接字关闭。)

我哪里出错了。

谢谢

【问题讨论】:

    标签: linux sockets networking tcp proxy


    【解决方案1】:

    对于通用 TCP 转发器,关闭是正确的使用方法。当您从一侧读取 EOF 时,请停止读取该侧并关闭另一侧的写入。然后你可以继续读写另一个方向,直到它也给你一个EOF,然后你关闭两者。

    【讨论】:

    • 您将执行一次读取,获取最终数据,将其写入另一个套接字,执行另一次读取,获取 EOF,然后关闭。
    • 嘿艾伦,所以只是澄清一下:“world(www_sockfd)(client_sockfd)Proxy(server_sockfd)(browser_sockfd)Browser”现在如果我recv()返回0 server_sockfd 然后我需要在写入时关闭(client_sockfd)。有一次,我在 client_sockfd 上 recv(), 0 字节,然后在 client_sockfd 和 server_sockfd 上 close()。对吗?
    猜你喜欢
    • 2015-08-22
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多