close( mSocket );
终止TCP/IP连接的最佳方法是什么,该连接清理了系统上的开放套接字,但让远程方挂起。那就是我想要关闭一个插座的方式,对我来说是最低的成本,但对他们来说是最高的成本。
@尼古拉斯·威尔逊:
使用tcprepair似乎是个好主意。当套接字在TCP_REPAIR模式下关闭时,不会发送FIN或RST数据包。远程插座挂起。我要去试试看然后回去报告。下面是我的(未经测试的)代码:
if ( abuse )
{
int aux = 1;
if ( setsockopt( mSocket, SOL_TCP, TCP_REPAIR, &aux, sizeof( aux )) < 0 )
reportError( "Tried to do a rude socket close... but could not turn on repair mode.\n" );
}
close( mSocket );
好的,做了一些研究,我有了一个适合我的答案,基于tcprepair。它比我一开始想象的要复杂一点:
if ( abuse )
{
// read some bytes from the spammer - to establish the connection
u32 tries = 20;
while ( tries )
{
sleep( 1000 );
char tmpBuf[32];
s32 readCount = recv( mSocket, &tmpBuf[0], 32, 0 );
if ( readCount > -1 ) break;
tries--;
}
#ifdef TCP_REPAIR
int aux = 1;
if ( setsockopt( mSocket, SOL_TCP, TCP_REPAIR, &aux, sizeof( aux )) < 0 )
{
reportError( "could not turn on repair mode" );
}
#else // !TCP_REPAIR
// no TCP REPAIR - best we can do is an abort close
struct linger so_linger;
so_linger.l_onoff = 1;
so_linger.l_linger = 0;
if ( setsockopt( mSocket, SOL_SOCKET, SO_LINGER, &so_linger, sizeof so_linger ) < 0 )
{
reportError( "Cannot turn off SO_LINGER" );
}
#endif // TCP_REPAIR
}
close( mSocket );
在内核级别,如果您关闭连接,TCP堆栈将发送FIN或RST数据包,无论您如何执行(关闭或关闭)。无论哪种方式都将通知攻击者您关闭了连接。
我们想悄悄地关闭连接,让他们等着发现你没有应答。因为我们有报复心。
但如果您在连接后立即通过IP阻止请求,而不首先读取套接字,则会以某种方式通知远程方。他们得到了RST。或者连接中的某些东西从未完全完成,远程系统几乎立即中止请求。
所以我们首先从黑客的套接字中读取几个字节。在我的例子中,套接字已经处于非阻塞模式。但如果不是,您想要将套接字设置为非阻塞,否则您将自己打开给黑客打开连接,但不发送数据包,让您的服务器挂起--就像您计划对他做的那样。如果几微秒后你没有收到一个数据包,你还是会关闭他。
但如果你从他那里读了几个字节,那么他的程序就会一直等待你的响应,而这个响应永远不会来。
像一个魅力一样工作,将您的浏览器指向此处:
http://oroboro.com/fail
铬至少会挂在那里5-10秒。看看我的日志,我每秒被打10次--他只能每10秒打我一次。从以下内容加载到我的系统:0。
我在我的C#网络项目中使用无状态,主要是因为它是一种很好的方法来添加功能,如套接字连接后的有线级授权、重新连接的延迟等。 话虽如此,但我自己却陷入了一些竞争状态和僵局--我向以下各州寻求解决问题的最佳方法: 它的功能是套接字将自动重新连接,并在连接时启动接收循环。如果出现套接字错误,它应该返回以释放资源,然后循环返回以重新启动。 然而,当我处理对象时,连接的套接字中止,这也释放了资源,并且它尝试自
问题内容: 大家好。我有一个使用ServerSocket和Socket类用Java编写的服务器。 我希望能够检测并处理断开连接,然后在必要时重新连接新客户端。 检测客户端断开连接,关闭套接字然后接受新客户端的正确步骤是什么? 问题答案: 大概是在从套接字读取数据,也许是在输入流上使用包装器,例如BufferedReader。在这种情况下,当相应的读取操作返回-1(对于原始read()调用)或为nu
计算机网络基础 ip地址 为了使网络上的计算机能够彼此识别对方,每台计算机都需要一个IP地址以标识自己。 IPv4:32位,IPv6:64位 OSI七层参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 地址解析 地址解析是指将计算机的协议地址解析为物理地址,即MAC(Medium Access Control)地址,又称为媒体访问控制地址。通常,在网络上由地址解析协议(ARP)
问题内容: 我想知道当轮询设置这些位时应该怎么做?关闭插座,忽略它还是什么? 问题答案: 甲装置插座不再连接。在TCP中,这意味着已接收和发送FIN。 A 表示套接字收到异步错误。在TCP中,这通常意味着已经接收或发送了RST。如果文件描述符不是套接字,则可能意味着设备不支持轮询。 对于上述两种情况,套接字文件描述符仍处于打开状态,并且尚未关闭(但可能已经被调用)。文件描述符上的A 将释放仍代表套
然而,我遇到了一些问题。特别是带有内部异常的WebException(“无法连接到远程服务器”): 无法对套接字执行操作,因为系统缺少足够的缓冲区空间或队列已满127.0.0.1:52395 我正在尝试以每线程500次迭代的方式运行100个线程。 我可以使用更少的迭代和/或更少的线程来操作测试,因为看起来套接字最终会退出这个TIME_WAIT状态。但是,这不是一个解决方案,因为它没有充分测试web
问题内容: 我正在调试基于ac的linux socket程序。作为网站上所有可用的示例,我应用了以下结构: 当删除服务器关闭其服务器程序时,我可以检测到断开连接。但是,如果拔下以太网电缆,则send函数仍然返回正值,而不是-1。 假设无法更改服务器端,如何在客户端程序中检查网络连接? 问题答案: 但是,如果拔下以太网电缆,则send函数仍然返回正值,而不是-1。 首先,您应该知道实际上并没有发送任