如何创建仅特定IP可以连接的服务器套接字

问题描述

是否可以创建一个ServerSocket,而不是对任何连接使用ServerSocket#accept方法,而是仅等待和接受来自特定IP的连接?

或者,是否有可能在接受连接之前先知道该连接的IP,以便我可以拒绝该连接的IP(如果不是来自该特定IP)?

解决方法

不。基础通信堆栈不支持TCP套接字。

accept调用本身返回一个套接字,然后可以查询该套接字以获取远程IP地址。如果您不喜欢该IP,则可以立即关闭套接字。

(顺便说一下,您接受的是一个“连接”,而不是一个“套接字”。套接字只是一个本地数据结构,在每个端点处一个套接字;套接字是在计算机上创建的,以响应接受连接。这就是您的电话和与另一端的人进行通话之间的区别。)

,

您不应该依赖源IP,因为从另一台主机发送具有相同IP的TCP / IP数据包很容易,请参见IP spoofing。您需要使用SSL套接字并对其进行一些身份验证。

,

在ServerSocket方面没有很多经验,但是在TCP套接字方面有一些经验。我认为这是不可能的,但是您可以做的是在接受之后验证IP地址(TCP和UDP套接字都接收另一台计算机的IP,因为有必要提供响应)。

我不知道您这样做的原因(尤其是考虑到IP通常由于许多原因会随时间动态变化)以及是否存在另一种解决问题的方法。

,

不确定在Java中,但是在c或python中是可能的。使用3级原始套接字,可以在接受之前用SYN数据包响应RST数据包来阻止连接。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...