为什么假设send可能返回的数据少于阻塞套接字上传输的请求数据?

在流套接字上发送数据的标准方法一直是调用send和一大块数据进行写入,检查返回值以查看是否所有数据都已发送,然后再次调用send直到整个消息被接受为止。 例如,这是一个常见方案的简单示例: int send_all(int sock,unsigned char * buffer,int len){ 不存在 while(len> 0){ nsent = send(sock,buffer,len,0); if(nsent == -1)//错误 返回-1; buffer + = nsent; len – = nsent; } 返回0; //好的,发送了所有数据 } 甚至BSD手册也提到了这一点 …如果套接字上没有可用的消息空间来保存要传输的消息,则send() 通常会阻塞 … 这表明我们应该假设send可以在不发送所有数据的情况下返回。 现在我发现这个相当破碎,但即使是W. Richard Stevens在他的标准参考书中假定这是关于网络编程的 ,而不是在开头的章节中,但更高级的例子使用他自己的写(写所有数据)函数而不是调用write。 现在我认为这仍然或多或少地被破坏,因为如果send无法传输所有数据或接受底层缓冲区中的数据并且套接字阻塞,则send应该阻塞并在整个发送请求被接受时返回。 我的意思是,在上面的代码示例中,如果发送返回的数据发送的数量较少,将会发生的情况是,将使用新请求再次调用它。 自上次通话以来有什么变化? 最多几百个CPU周期已经过去,因此缓冲区仍然是满的。 如果发送现在接受数据,为什么它不能接受它? 否则,我们将以低效循环结束upp,我们试图在无法接受数据并继续尝试的套接字上发送数据,否则? 因此,如果需要,似乎解决方法会导致代码效率极低,在这种情况下,应该避免阻塞套接字,而应该使用非阻塞套接字和select。

如何获取结构数据的hexdump

…. finalize(char *hdrs, sendip_data *headers[], int index, sendip_data *data, sendip_data *pack) { …….. 出于调试目的,我想要data和pack结构的hex转储,其类型为sendip_data ,这是一个非常复杂的结构。 实际上它们包含一些二进制信息,所以我不确定我的项目的输出是否正确。 因此,出于调试目的,我想将数据写入文件,以便我可以使用hexdump,如下所示 – $hexdump -C file.txt 另外因为这是一个/ w数据包的运行时生成所以我也不确定data和pack结构的长度,我认为fread / fwrite将需要..所以请给我一些建议。

C函数指针语法

我的问题非常简单。 通常,在声明某个变量时,将其类型放在它之前,如: int a; 函数指针的类型可能是:int(*)(int,int),以防我们指向一个带两个int的函数并返回一个int。 但是,在声明这样的指针时,其标识符不在类型之后,如: int(*)(int,int) mypointer; 相反,你必须在中间写入标识符: int(*mypointer)(int,int); 为什么会这样? 对不起,我知道这是一个非常简单的问题…… 感谢大家的回复。 如

X,Y在C函数中传递数组的大小

我已经声明了我想要找到对角线[0] [0] …… [5] [5]和[0] [5] …… [5] [0]的最小值的函数。 我有算法但我的问题是实际的函数头。 我在为函数创建正式参数时遇到问题。 我知道我们必须将至少x[][this]大小的数组传递给函数,但我尝试了各种组合,甚至 double minimum(int size, double x[][size]){…} double minimum(double x[][int size]){…} 第一种情况在调用时出错: minimum(10, x[][10]) error: expected expression before ‘]’ token ` 第二种情况在函数声明中给出错误: error: expected expression before ‘int’ 有人可以告诉问题是什么(或问题是什么)?

GCC中的C11 ?

我正在尝试使用thread.h编译一些C11代码,但我不能。 我已经重新编译了GCC(现在运行4.6.2),我正在尝试使用gcc -std=c1x file.c -o file进行编译。 我可以用g ++(使用thread库)来做到这一点,但我不能在C中。是否thread.h没有包含在GCC发行版中的thread.h ?

Cuda内核返回向量

我有一个单词列表,我的目标是在一个非常长的短语中匹配每个单词。 我在匹配每个单词方面没有问题,我唯一的问题是返回包含每个匹配信息的结构向量。 在代码中: typedef struct { int A, B, C; } Match; __global__ void Find(veryLongPhrase * _phrase, Words * _word_list, vector * _matches) { int a, b, c; […] //Parallel search for each word in the phrase if(match) //When an occurrence is found { _matches.push_back(new Match{ A = a, B = b, C = c […]

使用malloc定义2D数组并对其进行修改

如何使用malloc定义2D数组? (比如10X20)。 第二,我可以增加行数或列数而不创建新增加的数组并将所有数据复制到它吗? 例如,我如何分配内存,以便arrays为10×30或15×20? 谢谢!

融合乘法加法和默认舍入模式

使用GCC 5.3,以下代码包含-O3 -fma float mul_add(float a, float b, float c) { return a*b + c; } 生成以下程序集 vfmadd132ss %xmm1, %xmm2, %xmm0 ret 我注意到GCC已经在GCC 4.8中使用了-O3 。 Clang 3.7与-O3 -mfma产生 vmulss %xmm1, %xmm0, %xmm0 vaddss %xmm2, %xmm0, %xmm0 retq 但是Clang 3.7和-Ofast -mfma产生的代码与GCC相同, -O3 fast为-O3 fast 。 我很惊讶GCC使用-O3因为从这个答案来看 除非允许放宽的浮点模型,否则不允许编译器融合分离的加法和乘法。 这是因为FMA只有一个舍入,而ADD + MUL有两个舍入。 因此,编译器将通过融合违反严格的IEEE浮点行为。 但是,从这个链接说 无论FLT_EVAL_METHOD的值如何,任何浮点表达式都可以收缩,即,计算好像所有中间结果都具有无限范围和精度。 所以现在我感到困惑和担忧。 GCC是否有理由将-FMA与-O3一起使用? 融合是否违反了严格的IEEE浮点行为? […]

在C中初始化变量

我知道有时如果你没有初始化一个int ,你会得到一个随机数,如果你打印整数。 但是将所有内容初始化为零似乎有点愚蠢。 我问,因为我正在评论我的C项目并且我非常直接进行缩进并且它完全编译(90/90谢谢Stackoverflow)但我希望在样式点上得到10/10。 所以,问题是:何时适合初始化,何时应该声明一个变量: int a = 0; 与 int a;

正则表达式拉出C函数原型声明?

当谈到正则表达式时,我在学习曲线上的某个地方,我需要使用它们来自动修改一堆C头中的函数原型。 有没有人知道一个不错的正则表达式来查找C头中的任何和所有函数原型,同时排除其他所有内容? 编辑:最初不清楚的三件事: 我不关心C ++,只关心C.这意味着没有模板等担心。 该解决方案必须与typedef和structs一起使用,不仅限于基本的C类型。 这是一种一次性的事情。 它不需要漂亮。 只要它有效,我不在乎它有多大,但我不想要一个复杂的,难以实施的解决方案。