gpt4 book ai didi

c - 从 TCP 套接字读取错误数据

转载 作者:可可西里 更新时间:2023-11-01 02:44:33 25 4
gpt4 key购买 nike

我正在尝试通过 TCP 套接字按 block 发送数据。服务器代码执行以下操作:

#define CHECK(n) if((r=n) <= 0) { perror("Socket error\n"); exit(-1); }
int r;

//send the number of blocks
CHECK(write(sockfd, &(storage->length), 8)); //p->length is uint64_t

for(p=storage->first; p!=NULL; p=p->next) {
//send the size of this block
CHECK(write(sockfd, &(p->blocksize), 8)); //p->blocksize is uint64_t

//send data
CHECK(write(sockfd, &(p->data), p->blocksize));
}

在客户端,我读取大小,然后读取数据(相同的 CHECK makro):

CHECK(read(sockfd, &block_count, 8));
for(i=0; i<block_count; i++) {
uint64_t block_size;
CHECK(read(sockfd, &block_size, 8));

uint64_t read_in=0;
while(read_in < block_size) {
r = read(sockfd, data+read_in, block_size-read_in); //assume data was previously allocated as char*
read_in += r;
}
}

只要客户端和服务器都在同一台机器上运行,它就可以正常工作,但是当我通过网络尝试这个时,它有时会失败。特别是,前 300-400 个 block (à ~587 字节)左右工作正常,但随后我得到不正确的 block_size 读数:

received block #372 size : 586
read_in: 586 of 586
received block #373 size : 2526107515908

很明显,然后它就崩溃了。我的印象是 TCP 协议(protocol)确保没有数据丢失并且所有内容都以正确的顺序接收,但考虑到它已经在本地工作,这怎么可能,我的错误是什么?

最佳答案

无法保证当您读取 block_countblock_size 时,您会一次性读取所有 8 个字节。

关于c - 从 TCP 套接字读取错误数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13247264/

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