简而言之:服务器成功调用:: send(),但数据不会在电缆上传出.客户端在几秒钟后发送其退出命令,因为它没有收到任何东西,并且服务器正确接收了该命令.
详细信息:服务器每1/10秒向其客户端发送一个命令,每秒钟发送一次心跳.客户端只返回心跳的确认.我们修改了服务器应用程序以记录发送和接收的每个命令,我们用Wireshark记录了pc的流量.我们可以将每个记录的命令与TCP数据包匹配,直到问题出现.问题一次只影响一个客户端.数据继续与其他客户端正常流动.在遇到麻烦之前,连接通常会工作几分钟.连接应该从客户端启动到关闭(即几天)的那一刻起作用.
出现问题时,日志文件包含预期的命令,但Wireshark转储不包含任何内容.下图显示了一个客户端的流量.红线是交通停止时,但服务器继续成功调用:: send().
大约4秒后,客户端超时并关闭连接.它发送一个quit命令,服务器正常接收它.
更令我困惑的是,包含quit命令的数据包未通过TCP ACK数据包进行确认.好像TCP连接在发送端完全卡住了.重传是该阻塞的影响,但即使TCP SYN建立新连接也没有正确处理,也没有得到简单的TCP ACK.
大约30秒后,问题消失,最终接受SYN数据包,并继续与新连接进行通信.
这是在各种Windows版本上测试的.在测试期间,使用了远程桌面会话,它从未因同一问题而断开连接.它保持连接数小时没有任何问题.当客户端通过无线网桥时,问题更加频繁.我们在无线端点的两侧使用Wireshark,我们看不到可以解释更高断开率的重传或丢包.
当许多客户端连接到同一个网桥时,它们不会同时发生故障.一次只有一个.所以无线噪音似乎并不是一个解释.我们可以在Wireshark转储中看到一些重传,但通信继续照常进行,并且在问题发生之前没有重传.接入点连接到服务器的交换机.客户端PC和服务器pc不使用无线网卡.
很长一段时间,我们很难偶尔断开连接是由网络引起的,但越来越多的安装是无线的,现在断开连接频繁,以至于它们给用户带来了问题.
我们尝试使用和不启用Windows防火墙.即使禁用防火墙,我们也添加了端口例外.客户端或服务器都没有防病毒软件.
我正在尝试制作一个简单的程序来枚举磁盘上的文件,但是我却停留在UTF的前沿。
我正在使用boost :: recursive_directory_iterator枚举文件。效果很好,但是Windows设置为“加拿大法语”,并且许多文件和目录都带有法语字符(例如é,è,ç)。这些文件名未在屏幕上正确显示,我正在使用wcout。我看到一个“?” 而不是尖锐的字符。即使boost :: filesystem :: ifstream也无法打开这些文件。
我试图添加“ std :: locale :: global(std :: locale(“”)))“,但起初只抛出一个异常。我发现,当在执行程序时将LANG设置为“”时,先前的命令不会再抛出任何异常,而是仅设置“ C”语言环境,而不是被OS使用(我希望是“ fr_CA.UTF-8”或“ fr_CA.ISO8859-1”)。LANG的任何其他值都会使异常返回...
要使Cygwin gcc程序在i18n世界中可用,必须做些什么?
我写了这个来测试各种语言环境ID:
#include <iomanip>
#include <iostream>
#include <locale>
using namespace std;
void tryLocale(string ID)
{
try{
cout << "Trying " << std::setw(18) << std::left << "\"" + ID + "\" ";
std::locale Loc(ID.c_str());
cout << "OK (" << Loc.name() << ")" << endl;
}catch(...){
cout << "FAIL" << endl;
}
}
const char *Locales[] = { "", "fr", "fr_CA", …Run Code Online (Sandbox Code Playgroud)