我正在使用套接字编写一个简单的tcp服务器应用程序.据我所知,我可以在调用accept()后获取客户端的IP地址和端口.
现在假设我有一个banlist,我想从我的服务器禁止一些IP地址.有没有比接受连接然后丢弃它更好的方法?
有没有办法在接受连接之前获取客户端的IP和端口?如果我们接受()为什么我们没有像垃圾()那样的东西?有没有办法拒绝连接或只是忽略来自主机的连接尝试?
我糊涂了.
如果我通过浏览器(OSX上的Chrome或Safari)指向此网站,它会完美显示所有SVG:
现在,如果我在该页面上查看源代码,复制它,并将其粘贴到我桌面上的新HTML文档中,然后使用任一浏览器查看,我根本就没有SVG.
为什么不同?
为什么SVG在网站上工作,而不在本地HTML文件中工作?
谢谢!
我写了自己的引用计数内存管理器c ++(为了好玩),我确信它并不完美;).现在,当我尝试使用它时,我得到了随机的SIGTRAP信号.如果我注释掉与该内存管理器相关的每一行,一切运行正常.获取SIGTRAP-s而不是SIGSEGV非常奇怪.我知道当程序遇到断点时抛出SIGTRAP-s,但没有设置断点.我在另一个线程中读到,调试exe和dll的构建必须是最新的.它们是最新的,所以这不是原因.
有谁知道为什么会这样?
我正在制作一个简单的RTS游戏.我希望它运行得非常快,因为它可以与数千个单位和8个玩家一起使用.
一切似乎都完美无缺,但似乎视线计算是一个瓶颈.这很简单:如果一个敌方单位比我单位的任何一个LOS范围更近,它将是可见的.
目前我使用了一个非常天真的算法:对于每个敌方单位,我检查我的单位是否有人看到他.它是O(n ^ 2)
因此,如果有8个玩家并且他们每个拥有3000个单位,那么在最坏的情况下每个玩家将需要3000*21000 = 63000000个测试.这很慢.
更多细节:它是一个愚蠢的简单2D空间RTS:没有网格,单位在任何地方沿着直线移动,没有碰撞,所以它们可以相互移动.因此,即使数百个单位也可以在同一地点.
我想以某种方式加速这个LOS算法.有任何想法吗?
编辑:
更多细节:
我正在使用异步I/O,因为它不会阻塞调用线程并在幕后执行线程处理.如果我在同一个Stream上调用多个异步操作(如BeginWrite()),我是否需要担心数据缓冲区内容是否混合在一起?
我们假设我想发送3个缓冲区:
Buffer1: 1111111111
Buffer2: 2222222222
Buffer3: 3333333333
Run Code Online (Sandbox Code Playgroud)
我不介意缓冲区是否以错误的顺序发送,所以
333333333311111111112222222222
Run Code Online (Sandbox Code Playgroud)
没问题,但缓冲内容是否可能完全混合在一起?
122213121212122333313111223333
Run Code Online (Sandbox Code Playgroud)
PS:我100%肯定有人已经以某种形式问过这个......
我阅读了有关Meltdown/Spectre漏洞的文章,该文章允许使用CPU中的硬件错误从内核读取特权数据.它说:
诀窍是在正常用户进程中排列指令,使得处理器在执行任何安全检查之前推测性地从受保护的内核内存中获取数据.关键的Meltdown-exploiting x86-64代码可以像......一样简单
Run Code Online (Sandbox Code Playgroud); rcx = kernel address ; rbx = probe array retry: mov al, byte [rcx] shl rax, 0xc jz retry mov rbx, qword [rbx + rax]当用户进程触发异常时,尝试从内核地址获取一个字节 - 但后续指令已经不按规范推测执行,并根据获取的字节的内容触摸缓存行.
引发异常,并在其他地方进行非致命处理,而无序指令已经对字节的内容起作用.在缓存上执行一些Flush + Reload魔术会显示触摸了哪个缓存行,从而显示内核内存字节的内容.反复重复此操作,最后转储内核内存的内容.
有人可以解释这个Flush + Reload魔法是如何完成的,它如何揭示触摸的缓存线?
我正在尝试使用clang-tidy来实施C ++核心准则。尽管它确实有很多有效的要点,但我无法真正解决一件事:dlsym返回a void*,我需要以某种方式将其转换为适当的函数指针。为此,我使用reinterpret_cast。由于准则禁止这样做,因此我对此有警告。当然,我可以在//NOLINT任何地方发表评论,但是我正在寻找一种不会使用的解决方案,reinterpret_cast因此警告会消失。
有没有解决此问题的方法?
在C++中,您可以轻松地分配一维数组,如下所示:
T *array=new T[N];
Run Code Online (Sandbox Code Playgroud)
你也可以用一个语句删除它:
delete[] array;
Run Code Online (Sandbox Code Playgroud)
编译器将知道如何解除分配正确的字节数的魔力.
但为什么不能像这样分配二维数组呢?
T *array=new T[N,M];
Run Code Online (Sandbox Code Playgroud)
或者甚至喜欢这个?
T *array=new T[N,M,L];
Run Code Online (Sandbox Code Playgroud)
如果你想要一个多维度,你必须这样做:
T **array=new T*[N];
for(int i=0;i<N;i++) array[i]=new T[M];
Run Code Online (Sandbox Code Playgroud)
如果你想要一个使用矩阵的快速程序(矩阵运算,特征值算法等等),你可能也希望利用缓存来获得最佳性能,这需要数据在同一个地方.使用vector<vector<T> >是相同的情况.在C中,您可以在堆栈上使用可变长度数组,但是您无法在堆上分配它们(并且堆栈空间非常有限),您也可以在C++中执行可变长度数组,但它们不会出现在C中++ 0x中.
唯一的解决方法是相当hackish和错误 - 错误:
T *array=new T[N*M];
for(int i=0;i<N;i++)
for(int j=0;j<M;j++)
{
T[i*N+j]=...;
}
Run Code Online (Sandbox Code Playgroud) 当你将cctor,dtor或op =添加到你的类时,我知道C++的经验法则,你需要添加其他两个,以使你的类在所有情况下都能正常工作.
有什么情况下你不需要提供所有三个,只有一个或两个?
如果你将其中一个添加到你的类中,为什么C++不要求你添加它们?
EDIT1:
你提到的例子当你不仅不需要它们中的一些时,而且你不想拥有它们,所以你想让它们成为私有或受保护的.但是你仍然需要在代码中编写它们,即使是空体.
当你通过添加一个带有空体的虚拟析构函数来创建一个类polimorphic时,我没有全部使用它们的唯一正当理由.但是只要你在析构函数体内写一些东西,就应该考虑在cctor的主体中写一些东西,并且op =.
我正在寻找一些例子,当你不需要编写所有3种方法时,即使新手正在使用你的类,你也可以省略其中的一些而不会在你的课程中造成错误.:)
c++ standards destructor copy-constructor assignment-operator
为什么javascript中没有这样的函数为其继续设置超时,保存必要的状态(范围对象和执行点),终止脚本并将控件返回给浏览器?超时到期后,浏览器将加载执行上下文并继续执行脚本,即使JS引擎是单线程的,我们也会有一个真正的非浏览器阻塞睡眠功能.
为什么javascript中仍然没有这样的功能?为什么我们仍然需要将代码切分为函数并将超时设置为下一步以实现睡眠效果?
c++ ×5
standards ×2
algorithm ×1
asynchronous ×1
big-o ×1
browser ×1
c# ×1
caching ×1
clang-tidy ×1
destructor ×1
gdb ×1
html ×1
io ×1
javascript ×1
math ×1
mingw ×1
optimization ×1
sockets ×1
svg ×1
windows ×1
x86 ×1
xhtml ×1