结果:
在步骤6中,如果服务器在几分钟内关闭死连接--CY,则新通道CY2将变为单向--从客户端Y发送的数据不能到达服务器,包括ACK数据包,而反之亦然。
如果服务器在很长的时间(例如2小时)内关闭了已死的连接--CY,则不会出现任何问题。
这个问题只在运行NAT时才会发生,至少我们在同一个LAN中运行应用程序时不会重现这个问题(不需要穿越NAT)。
psuedocode:
//server
listenfd = socket(,SO_STREAM,);
localAddr.port = htons(8013);
localAddr.ip = inet_addr(INADDR_ANY);
bind(localAddr...)
listen(listenfd, 100);
...
//using select model
select(maxFd, &fdSet, NULL, NULL);
for(...)
{
if (FD_ISSET(listenfd))
{
fd = accept(...)
set_non_block(fd);
...
}
...
}
更多信息:
1)第一台计算机上的连接A:192.168.10.4:13000...路由器A:NAT-现在:从PublicIP:8661(随机)..网络..路由器B:NAT(到端口:8013,端口转发)...服务器B
2)第二台计算机上的连接B:192.168.10.7:13000...路由器A:NAT-现在:从PublicIP:8777(随机)..网络..路由器B:NAT(到端口:8013,端口转发)...服务器B
3)拔出电线,连接A已断开,现在在第三台计算机上创建新的连接C:192.168.10.10:13000...路由器A:NAT-现在:从PublicIP:8869(随机)..Network..路由器B:NAT(到端口:8013,端口转发)...服务器B
如果我们从服务器关闭连接A,那么连接C将变成单向的,但是如果我们在2小时内从服务器关闭连接A,那么连接C将保持正常。
哇,真是个难题。我想我有一个可能的答案。我并不是真的喜欢其中的含义--但我猜当看标准时,它们是不可避免的(这里是维基百科的简化)。
NAT(尤其是全锥)的工作方式是为客户端提供内部地址(ip和端口),以匹配它试图到达的外部地址。任何返回流量都是通过内部地址发送,然后由路由器转发到外部地址。
让我们用一个例子来扩展这个简短的解释,并说明这对你意味着什么。
非常不理想,但可能取决于NAT的实现方式。而且由于这似乎是NAT的问题--直接连接时不会显示...
现在,我已经在我的解释中看到了一个漏洞--也就是说,这将意味着您不能同时为同一服务器打开两个套接字,因为任何返回都将被篡改。好吧,我能想到的唯一原因是套接字仍然是打开的,因此网关不会将其视为已死,然后为该客户端创建第二个映射。
希望我至少说得有道理。
问题内容: 我的插座似乎有问题。在下面,您将看到一些分叉服务器和客户端的代码。服务器打开一个TCP套接字,客户端连接到它,然后关闭它。睡眠用于协调时间。在客户端close()之后,服务器尝试将write()写入其自己的TCP连接的末端。根据write(2)手册页,这 应该 给我一个SIGPIPE和一个EPIPE errno。但是,我看不到。从服务器的角度来看,写入本地关闭的套接字 成功 ,并且没有
问题内容: 任何人都可以通过TCP发送Ascii msg的示例给我(在网上找不到示例) 谢谢, 射线。 问题答案: 这是一个写入和读取回显服务器的示例。 简化摘录:
我有一个很奇怪的问题快把我逼疯了。 我有一个Ruby服务器和一个Flash客户端(动作脚本3)。这是一个多人游戏。 问题是,一切都在完美地工作,然后,突然,一个随机的球员停止接收数据。当服务器因为不活动而关闭连接时,大约20-60秒后,客户端接收到所有缓冲的数据。 null 我不认为这是一个操作系统/网络问题,因为我已经从一个位于西班牙的VPS换到了位于爱尔兰的亚马逊EC2,问题仍然存在。 我觉得
创建套接字并建立连接后,我使用BufferedReader和PrintWriter从套接字进行写/读操作。 当我用完插座后,我就把它关上。 这将导致发送一个TCP fin,并留下一个半开的传输控制协议。有什么方法可以检测客户端/服务器是否关闭了连接?
问题内容: 我有一个嵌套的字典,我们称它为字典d。该词典的键是一个整数,每个键的值是另一个词典。我正在python 2.7上尝试一个简单的代码来更新一个外键的值,但似乎它正在更新外键的ALL的值。 希望这些代码将使其更易于理解。这是我的意见。 然后是输出: 您会看到,我只为d [0] [‘mean’]分配了‘1’,但是d [1] [‘mean’]也有所更新。如果我增加d键的数量,它将只更改所有d键