我有一个循环,它通过存储在缓冲区中的图像,一次抓取1024个字节,并将此千字节作为UDP数据包发送。以下是相关的代码部分。
当if (buf.bytesused - curr*1024 > 1024)
大于curr*1024
时,为什么我的第二个if语句buf.bytesused
失败?我陷入无限循环,直到memcpy最终抛出一个seg错误才结束。我的buf.bytesused大约是900,000,但它不是循环大约900次,而是继续前进,即使buf.bytesused - curr*1024
给出否定结果,肯定小于1024。
如果不清楚:当curr很小时,buf.bytesused - curr * 1024>像我期望的那样满足1024,并运行第二个if-block。然而,当curr变大(甚至如此大以至于buf.bytesused - curr * 1024为负)时,第二个if-block仍在运行,而不是第三个块,在else之后。
buf.bytesused
是无符号的32位int。
#define FRAME_START 0x0
#define FRAME_END 0xF
#define FRAME_MID 0xA
uint_32 buf.bytesused = 921600;
char frameInfo = FRAME_START;
char frameNum = i;
int curr = 0;
while (frameInfo != FRAME_END) {
if (curr == 0) {
frameInfo = FRAME_START;
memcpy(&frameInfo, &udpBuf[0], 1);
memcpy(&frameNum, &udpBuf[1], 1);
memcpy(buffers[buf.index].start + curr*1024, udpBuf + 2, 1024);
}else if (buf.bytesused - curr*1024 > 1024) {
frameInfo = FRAME_MID;
memcpy(&frameInfo, &udpBuf[0], 1);
memcpy(&frameNum, &udpBuf[1], 1);
memcpy(buffers[buf.index].start + curr*1024, udpBuf + 2, 1024);
} else {
frameInfo = FRAME_END;
memcpy(&frameInfo, &udpBuf[0], 1);
memcpy(&frameNum, &udpBuf[1], 1);
memcpy(buffers[buf.index].start + curr*1024, udpBuf + 2, (buf.bytesused % 1024));
}
if (sendto(s, udpBuf, BUFLEN, 0, &si_other, slen)==-1)
diep("sendto()");
curr++;
}
顺便说一句,有人能告诉我memcpy的错误吗?它不会将我的两个字符的值复制到我的缓冲区。
答案 0 :(得分:4)
if (buf.bytesused - curr*1024 > 1024) fail when curr*1024 gets larger than buf.bytesused
buf.bytesused
为unsigned
时可能会出现问题。
如果是否定并签名,那么上述比较应该失败。
要解决,你也可以使用简单的数学。
if (buf.bytesused > curr*1024 + 1024)
或
if (buf.bytesused > (curr + 1)*1024)
除非curr+1
为否定,否则这些条件不会因签名而导致问题。
我认为这可以解决你的问题。
答案 1 :(得分:3)
如果人们想知道,实际问题就在这里:
frameInfo = FRAME_END;
memcpy(&frameInfo, &udpBuf[0], 1);
frameInfo
在设置为FRAME_END
后会被覆盖,因此while (frameInfo != FRAME_END)
永远不会评估为false。这导致程序进入无限循环的事实导致OP错误地认为他的if语句是错误的。使用调试器而不是假设您知道问题是什么总是很好的做法!