在我accept()连接,然后write()到客户端套接字之后,最好是一次写入要发送的所有数据还是以块的形式发送它?
例如:
接受,写1MB,断开连接
…要么…
接受,写入256个字节,写入256个字节,... n,断开连接
我的直觉告诉我,底层协议会自动执行此操作,并进行错误更正等.这是正确的,还是我应该将数据分块?
在你问之前,不,我不确定我在哪里想到数据块 - 我认为这是我从编程C#web服务中获得的本能(为了绕过接收缓冲区限制等,我认为).坏习惯?
注意:我正在使用C.
我需要一个程序,它在使用pcap格式的捕获文件中打印数据包的数量.这个数字似乎在pcap标题中不可用(可能是因为它是在捕获开始之前写的)并且它似乎没有文件中的"页脚",并且包含此信息.
因此,我认为唯一的算法是遍历所有数据包并对它们求和.它在O(N)中,对于大的痕迹,很长.
我在这里发帖,看看有人有一个聪明的主意吗?
我用"C"标记,因为它是我目前使用的语言,但我相信这是一个与语言无关的问题.
我使用以下宏来计算数组的大小:
#define G_N_ELEMENTS(arr) ((sizeof(arr))/(sizeof(arr[0])))
Run Code Online (Sandbox Code Playgroud)
但是,当我计算函数中数组的大小(计算的值不正确)而不是调用函数的位置(计算的正确值)时,我看到它计算的值的差异.代码+输出如下.任何想法,建议,提示等.欢迎.
DP
#include <stdio.h>
#define G_N_ELEMENTS(arr) ((sizeof(arr))/(sizeof(arr[0])))
void foo(int * arr) // Also tried foo(int arr[]), foo(int * & arr)
// - neither of which worked
{
printf("arr : %x\n", arr);
printf ("sizeof arr: %d\n", G_N_ELEMENTS(arr));
}
int main()
{
int arr[] = {1, 2, 3, 4};
printf("arr : %x\n", arr);
printf ("sizeof arr: %d\n", G_N_ELEMENTS(arr));
foo(arr);
}
Run Code Online (Sandbox Code Playgroud)
输出:
arr : bffffa40
sizeof arr: 4
arr : bffffa40
sizeof arr: 1
Run Code Online (Sandbox Code Playgroud) 我想我已经很好地掌握了如何在C++中处理内存,但是在C中做它是不同的我有点不对劲.
在C++中,我有构造函数和析构函数,我有非常简单的new和delete,我知道如何使用RAII封装它,使用智能指针和类.
但是在CI中无法以同样的方式处理malloc和free.我不知道如何隐藏它们以及如何自动化.我所能想到的只是使用函数来启动和销毁我的指针.但是我应该如何构建我的内存处理?
写这篇文章的时候,我意识到这更像是一个关于我理解C流程的问题,而不是其他任何问题,但一次只能提出一个问题.
编辑:谢谢你的答案,但我需要改写自己.
当我说我使用RAII和C++的智能指针时,我不希望C相同,我知道它不一样.但是我如何处理C++中的内存分配与这些技术有关.
例如,在我的类中,我动态地添加和销毁我的类使用的内存.这样我就可以实现一种封装,我不需要知道什么时候/如何/为什么类处理它的内存,它就是这样.这意味着我可以"隐藏"较低的内存处理,只关注一些"更大"的类.
我想知道的是在C中处理内存的最佳做法是什么?没有带有构造函数/析构函数的类来为我处理这个问题.在函数的开头分配内存或使用为我创建它的函数是否合适?我应该如何再次释放他们?
这些是广泛的问题,它们因情况而异,但您更喜欢处理它?您可以提供哪些提示和课程?
我编写了一个转换器,它接受openstreetmap xml文件并将它们转换为二进制运行时渲染格式,通常约为原始大小的10%.输入文件大小通常为3GB或更大.输入文件不会一次性加载到内存中,而是在收集点和多边形时进行流式处理,然后在它们上运行bsp并输出文件.最近在较大的文件上,它耗尽内存并死掉(有问题的一个有1400万个点和100万个多边形).通常我的程序在发生这种情况时使用大约1gb到1.2gb的ram.我已经尝试将虚拟内存从2增加到8GB(在XP上),但这种改变没有任何效果.此外,由于此代码是开源的,我希望无论可用的ram(尽管速度较慢)都可以使用它,它可以在Windows,Linux和Mac上运行.
我可以使用哪些技术来避免内存不足?处理较小子集中的数据,然后合并最终结果?使用我自己的虚拟内存类型的处理程序?还有其他想法吗?
Eclipse CDT为C/C++代码提供了两个索引器(Preferences> C/C++> Indexer).有谁知道这两者之间的确切区别是什么?
帮助文件并不完全具有启发性:
"CDT支持其他索引器的贡献,2个索引器提供默认CDT版本:
快速C/C++索引器:提供最快的索引功能 - 声明和交叉引用信息.这是推荐的索引器.
完整的C/C++索引器:以性能为代价提供更加准确的索引功能 - 包括声明和交叉引用信息."
更准确的意思是什么:它是否会索引更多的东西,如果是这样的话?
如果使用SIGKILL终止进程,它对内存映射文件所做的更改是否会刷新到磁盘?我假设如果操作系统确保在通过SIGKILL终止进程时将内存映射文件刷新到磁盘,那么它也将使用其他终止信号(SIGABRT,SIGSEGV等等)执行此操作.
标题是不言自明的:有没有人知道C的(好的)属性文件阅读器库,如果没有,C++?
[编辑:具体来说,我想要一个处理Java中使用的.properties文件格式的库:http://en.wikipedia.org/wiki/.properties]
如何检查指针是否属于某种类型?
使用sizeof还不够.
我试图避免将id-numbers放入我的结构中来识别它们的类型.假设可能是gcc在进程中的某处放置了一个struct定义,并将定义映射到指针的已分配内存.如果这是真的,我认为会有一些检查指针类型.
如果你能帮助我解决这个困境.现在,我知道C\C++,我知道asm,我知道dll注入,我知道虚拟内存寻址,但我无法弄清楚CheatEngine等软件如何设法在另一个进程中更改变量的值.
对于那些不知道的人,第三方作弊引擎工具可以扫描程序存储空间中的值,并识别具有给定值的变量的位置并进行更改.
我的问题是,他们是如何做到的?
给定一个地址,如果我要编写C代码,如何在不得到无效寻址错误的情况下更改属于另一个进程的该地址的值?
谢谢.