gpt4 book ai didi

C:丢失的 UDP 数据包的最后字节

转载 作者:太空宇宙 更新时间:2023-11-04 06:26:33 24 4
gpt4 key购买 nike

我正在编写一个基于 UDP 的流媒体服务器,遇到了一个奇怪的问题,我确信这只是一个简单的错误,但我找不到解决方案。服务器执行以下操作:

FILE* infile = fopen(inf, "rb");
register int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
int16_t buffer[LENGTH+HEADER];
struct header header;
int16_t data[LENGTH];
uint32_t number = 0;

/*set socket options etc. */

while(!feof(infile)){
fread(data, 1, LENGTH, infile);
/* if i write the contents of data to a file here, the error below occurs*/
fwrite(data, 1, LENGTH, testfile);
/*create a header, encode everything with htons/htonl*/


if(sendto(sock, buffer, LENGTH+HEADER, 0, (struct sockaddr*) &to,
sizeof to) < 0)
/*die*/
}

这似乎有效。我可以解码它并且数据没有损坏。但是,我编写了一个可以正常工作(或者更确切地说:不起作用)的测试客户端,如下所示:

struct sockaddr_in si_other, si_me;
register int s;
unsigned int slen = sizeof(si_other);
int16_t buf[LENGTH+HEADER];
int16_t data[LENGTH];
FILE* file = fopen(of, "wb");

/*open socket, set options, etc. */

while(1){
if(recvfrom(s, (char *)buf, LENGTH+HEADER, 0, (struct sockaddr*) &si_other,
&slen) < 0)
/*die*/
decode(buf, data);
/* If I write the decoded data to a file here, the error below occurs */
fwrite(data, 1, LENGTH, testfile);
if(is_empty(data) == 0){
printf("End signal received.\n");
break;
}
}

现在是我的问题。当我用 diff <(xxd test_before) <(xxd test_after) 检查十六进制的测试文件时,我明白了(示例差异行):

< 03d5ff0: f3fd f3fd 99fe 99fe 40ff 40ff e7ff e7ff  ........@.@.....
---
> 03d5ff0: f3fd f3fd 0000 0000 0000 0000 0000 0000 ................

这意味着数据包数据的最后 12 个字节丢失了。其他一切都很好。

这只是测试代码,所以它不是那么重要(我猜),但它很奇怪,我想知道为什么。

有什么想法吗?

编辑:

我现在已经从答案中尝试了一些方法,到目前为止没有任何进展。我会继续努力。

编辑 2:

代码在不同的机器上运行。我不确定问题出在哪里,但它似乎对除我以外的任何人都有效。抱歉耽误了您的时间,感谢您就如何改进代码等提出的所有建议!

提前致谢,卡森

最佳答案

您正在将 2 个字节 buf 转换为 char 并读取其中包含的一半。

recvfrom(s, (char *)buf, LENGTH+HEADER, 0, (struct sockaddr*) &si_other,
&slen)

buf 数组有 (LENGTH+HEADER) * 2 个字节,你只读了一半

char 数组用于发送接收

编辑

这是读取文件的方式:

unsigned char data[LENGTH];

fseek(inf, 0, SEEK_END);
int file_Size = ftell(inf);
fseek(inf, 0, SEEK_SET);
if(file_Size > LENGTH){
//file larger than data
}
fread(data, sizeof(unsigned char), file_Size, inf);

关于C:丢失的 UDP 数据包的最后字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26142622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com