如果您的TCP连接可能太慢并且UDP"连接"可能太不可靠,您使用什么?有各种标准的可靠UDP协议,你有什么经验吗?
请在每个回复中讨论一个协议,如果其他人已经提到您使用的协议,则考虑将其投票并使用评论进行详细说明(如果需要).
我对这里的各种选项感兴趣,其中TCP位于规模的一端而UDP位于另一端.提供了各种可靠的UDP选项,每个选项都带有TCP到UDP的一些元素.
我知道TCP通常是正确的选择,但是有一个备选列表通常可以帮助我们得出结论.像UDP,RUDP等基于UDP构建的东西各有利弊,你使用它们,你的经历是什么?
为了避免疑问,没有更多的信息,这是一个假设的问题,我希望这个问题会引出一个回复列表,详细说明需要做出决定的人可以使用的各种选项和备选方案.
我有一个客户仍在使用Visual Studio 6来构建生产系统.他们编写了使用STL并在多处理器机器上运行的多线程系统.
偶尔当他们改变其服务器机器的规格或增加其负载时,他们会"奇怪"地难以重现错误......
我知道Visual Studio 6开发存在一些问题,我想说服他们转向Visual Stuio 2005或2008(他们有Visual Studio 2005并将其用于某些项目).
此问题的目的是汇总已知问题或升级原因的列表,以及讨论或报告这些问题的链接.如果这些问题如何困扰你,那么拥有现实生活中的"恐怖故事"也会很有用.
我现在正在使用SChannel为基于异步(IOCP)的服务器而且我已经让大多数工作正常但我遇到了重新协商的问题.具体来说,当对等体A向对等体B发送重新协商请求并且对等体B用TLS1 NO RENEGOTIATION警告响应时,对等体A如何继续?我似乎在获得SEC_I_NO_RENEGOTIATION响应的时候有一个无效的上下文,这使我无法继续使用流...
更新了我已经做了一些更多的测试,它似乎不是一个无效的上下文,但我确实SEC_E_ENCRYPT_FAILURE从下次调用加密...
请求重新谈判实际上是否可以拒绝?或者仅NO RENEGOTIATION提醒信息错误消息现在意味着连接无用?如果是这样,为什么它被评论为"警告"而不是"错误"?不; TLS RFC(5246)清楚地表明,在没有重新协商警报之后,由同行决定是否可以继续...
更新如果我使用... 发送TLS警报没有任何区别ApplyControlToken() or if I send it using EncryptMessage() with SECQOP_WRAP_OOB_DATA
我正在一个 dll 中编写一些插件代码,该代码由我无法控制的主机调用。
主机假定插件导出为 __stdcall 函数。主机被告知函数的名称和它期望的参数的详细信息,并通过 LoadLibrary、GetProcAddress 动态地调用它并手动将参数推送到堆栈上。
通常插件 dll 公开一个常量接口。我的插件公开了一个在 dll 加载时配置的接口。为了实现这一点,我的插件公开了一组在编译 dll 时定义的标准入口点,并根据需要将它们分配给正在公开的内部功能。
每个内部函数可能采用不同的参数,但这会与物理入口点名称一起传达给主机。我所有的物理 dll 入口点都定义为采用单个 void * 指针,并且我通过从第一个参数和已与主机通信的已知参数列表的偏移量工作,自己从堆栈中编组后续参数。
主机可以使用正确的参数成功调用我的插件中的函数并且一切正常......但是,我知道 a) 我的函数没有按照定义的那样清理堆栈作为采用 4 字节指针的 __stdcall 函数,因此即使调用者已将更多参数压入堆栈,它们也总是在最后执行“ret 4”。b) 我无法处理不带参数的函数,因为 ret 4 会在我返回时从堆栈中弹出 4 个字节太多。
将我的插件追踪到主机的调用代码后,我可以看到实际上 a) 没什么大不了的;主机会丢失一些堆栈空间,直到它从调度调用返回,此时它会清理它的堆栈帧,从而清理我的垃圾;然而...
我可以通过切换到 __cdecl 而根本不清理来解决 b)。我假设我可以通过切换到裸函数并编写我自己的通用参数清理代码来解决 a)。
由于我知道刚刚调用的函数使用的参数空间量,因此我希望它像以下那样简单:
extern "C" __declspec(naked) __declspec(dllexport) void * __stdcall EntryPoint(void *pArg1)
{
size_t argumentSpaceUsed;
{
void *pX = RealEntryPoint(
reinterpret_cast<ULONG_PTR>(&pArg1),
argumentSpaceUsed);
__asm
{
mov eax, dword ptr pX
}
}
__asm
{
ret argumentSpaceUsed
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为 ret …
我正在托管代码(主要是C++/CLI)中构建一个工具,有两个版本,一个是"普通用户"版本,另一个是"专业版".
核心代码在两个版本之间是相同的这一事实导致我有点麻烦,因为我想将生成的工具打包为单个程序集(DLL),我不希望必须包含公共的.cpp文件两个版本工具的项目中的代码.我宁愿有一个公共代码的项目和每个工具版本的项目,并且每个版本的工具项目都依赖于公共代码并根据需要链接它.
在非托管C++中,我通过将公共代码放在静态库中并将工具的两个版本链接到它来实现这一点.我似乎无法在C++/CLI中使用它.似乎我被迫将公共代码构建到DLL程序集中,这导致了比我想要的更多的DLL.
因此,总而言之,我无法弄清楚如何在一个项目中构建公共代码并将其与每个最终产品项目链接以生成两个包含公共代码的单个DLL程序集.
我可能做错了什么,但我试图用netmodules和其他方法来解决这个问题,但是我无法让它工作.最后,我让它工作的唯一方法是告诉链接器链接公共代码程序集的构建产品而不是有效的结果但是有点像黑客恕我直言.
无论如何,有没有人对我应该如何解决这个问题有任何建议?
编辑:我想我应该提到这样一个事实,即生成的程序集不是100%托管代码,它们包含托管代码和非托管代码的混合,可能在使用C++/CLI生成的程序集中很常见...
.net ×1
assemblies ×1
c# ×1
c++ ×1
plugins ×1
schannel ×1
sockets ×1
ssl ×1
stdcall ×1
stl ×1
tcp ×1
udp ×1
visual-c++ ×1
visual-c++-6 ×1