.NET:Conditional Socket.Accept

时间:2009-04-12 13:01:26

标签: c# .net sockets tcp

似乎没有任何Socket或ListenSocket方法可以让我有条件地接受连接。

当我收到SYN时,我希望能够根据来源决定是否需要此连接,如果我发送SYN / ACK(接受连接)或RST(强制拒绝)。

有没有想要实现这一目标?不幸的是,我不能在接受后立即关闭连接,它根本不需要打开。我还想避免将其作为RAW套接字使用。

4 个答案:

答案 0 :(得分:1)

不幸的是,这是不可能的。没有办法有条件地接受使用TCP套接字连接。您只能在建立连接后对其进行过滤。

但你到底想要过滤的是什么?在获得SYN数据包时,您所知道的就是源的IP地址以及它们尝试连接的端口。看起来使用防火墙根据这些数据进行过滤会好得多。我意识到这不是通过你的应用程序控制,但它是一个替代考虑。

答案 1 :(得分:0)

如果不进入RAW模式似乎是不可能的。一旦套接字进入Winsock的监听模式,它就会接受任何事情和所有内容,即使是在调用Socket.Accept之前。

如果您需要此功能,则必须使用RAW模式并使用您自己的TCP堆栈解析数据包。

答案 2 :(得分:0)

也是如此。 Windows XP SP2及更高版本不再支持通过RAW套接字发送TCP数据包。有关详细信息,请参阅here

答案 3 :(得分:0)

自Windows Vista以来,有一个新的套接字选项允许这样做。但是没有标准库支持这一点。

https://msdn.microsoft.com/en-us/library/windows/desktop/dd264794(v=vs.85).aspx

http://www.winsocketdotnetworkprogramming.com/dotnetnetworkprogrammingsecurity13a.html