我试图通过UDP套接字发送文件(一次一个块)。 它可以正常工作.txt文件,但是当我尝试从.jpg / .rar读取它只读取几个字节(小于我“问”),即使这些文件是> 2MB。
我尝试使用打开/ pread(我也尝试使用lseek和读取)和fopen(二进制模式)/ fread / fseek和我得到相同的结果(即对于一个2MB的.jpg文件我得到这个输出“读取10偏移量0" )。 请告诉我我做错了什么。
这是负责从文件中读取块的代码:
void * work(void * p){ ... int psize=100; int file; //FILE *file; //open the file file=open(wArg.req.fileName, O_RDONLY); //file=fopen(wArg.req.fileName, "rb"); //read the file chunk from the offset buff=(void *) malloc(psize); n=pread(file, buff, psize, wArg.req.offset); //fseek(file,wArg.req.offset, SEEK_SET); //fread(buff, 1, psize, file); if(n<0){ perror("read"); exit(1); } printf("read %d from offset %d\n", (int)strlen(buff),wArg.req.offset); n=sendto(wArg.sock, buff, psize, 0, (struct sockaddr*)&caddr, sizeof(struct sockaddr_in)); printf("sent %d\n", (int)strlen(buff)); close(file); //fclose(file); ... }
二进制文件可以包含NULL
字节, strlen
在找到这样一个NULL
字节后将停止计数。 使用pread
的返回值来找出pread
的大小。
所有的str
*函数都需要C字符串,它必须以NULL
字节结尾 ,而不能在中间。
由于buff
是二进制数据,所以不能使用strlen (buff)
。 在执行pread
,您在n
中捕获的返回值包含读取的字节数。 你应该用sendto
来代替psize
。
pread()读取从偏移量偏移量(从文件开头)的文件描述符文件中的字节到buf开始的缓冲区。 文件偏移量不会更改。 由于它是一个二进制文件,所以strlen不能在这里工作…因此,使用pread并初始化psize来返回pread()的值。