【发布时间】:2009-04-12 13:01:26
【问题描述】:
似乎没有任何 Socket 或 ListenSocket 方法可以让我有条件地接受连接。
当我收到 SYN 时,我希望能够根据来源决定是否需要此连接,是发回 SYN/ACK(接受连接)还是 RST(强制拒绝)。
有没有人想实现这个目标?不幸的是,我不能在接受后立即关闭连接,根本不需要打开它。我还想避免将其用作 RAW 套接字。
【问题讨论】:
似乎没有任何 Socket 或 ListenSocket 方法可以让我有条件地接受连接。
当我收到 SYN 时,我希望能够根据来源决定是否需要此连接,是发回 SYN/ACK(接受连接)还是 RST(强制拒绝)。
有没有人想实现这个目标?不幸的是,我不能在接受后立即关闭连接,根本不需要打开它。我还想避免将其用作 RAW 套接字。
【问题讨论】:
很遗憾,这是不可能的。无法使用 TCP 套接字连接有条件地接受。您只能在连接建立后对其进行过滤。
但是您到底要过滤什么?在您获得 SYN 数据包时,您所知道的只是源的 IP 地址和它们尝试连接的端口。使用防火墙根据这些数据进行过滤似乎要好得多。我意识到这不是通过您的应用程序控制的,但它是一个可供考虑的替代方案。
【讨论】:
似乎不进入 RAW 模式是不可能的。一旦套接字进入 Winsock 的监听模式,它将接受任何东西,甚至在调用 Socket.Accept 之前。
如果您需要此功能,您必须使用 RAW 模式并使用您自己的 TCP 堆栈解析数据包。
【讨论】:
也刮一下。 Windows XP SP2 和更高版本不再支持通过 RAW 套接字发送 TCP 数据包。详情请见here。
【讨论】:
自 Windows Vista 以来有一个新的套接字选项允许这样做。但是没有标准库支持这一点。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd264794(v=vs.85).aspx
http://www.winsocketdotnetworkprogramming.com/dotnetnetworkprogrammingsecurity13a.html
【讨论】: