我有一个程序,它分配了一个32位int,并尝试使用read(2)从套接字中读取4个字节到该int中。
有时候读取是不完整的,可能只读了2个字节。有没有什么方法可以从这种情况中恢复?我想我必须在int的中间产生一个指针以进行另一次读取。
你应该如何处理这种情况?我能想象出一些丑陋的方法,但没有优雅的方法。
首先,您需要确保已经读取了4个字节。您可以使用类似于此函数(稍作修改)来完成这个操作:
#include <sys/types.h>
#include <sys/socket.h>
int readall(int s, char *buf, int *len)
{
int total = 0; // how many bytes we've read
int bytesleft = *len; // how many we have left to read
int n = -1;
while(total < *len) {
n = read(s, buf+total, bytesleft, 0);
if (n <= 0) { break; }
total += n;
bytesleft -= n;
}
*len = total; // return number actually read here
return (n<=0)?-1:0; // return -1 on failure, 0 on success
}
n == 0
处中断,否则你将会在流的末尾无限循环。 - user207421免责声明:这是糟糕的代码。不要这样做。
int value = 0;
int bytes = 0;
while ( (bytes += read(((char*)&value)+bytes, 4-bytes)) < 4 );
通过这里的信息和在C/C++中添加1个字节的正确方法是什么?,我得出以下结论:
int
和char[]
联合起来),但实际上,这种技术似乎并不比1更可靠。char[]
中的char*
。因此,处理此情况的正确方法是将所有字节读入数组中,并在之后构造int。ntohl
或位移进行重构为int。位移在主机机器字节顺序之间是可移植的,因为它是根据乘法定义的。char[]
,然后通过位移或ntohl
重构。非可移植的方法是像@Patrick87建议的那样将char *
指向您的int。char*
指向我的int。在我的目标平台上运行良好。