C 发送二进制数据
执行C 发送二进制数据,c,sockets,binary,C,Sockets,Binary,执行send()循环时是否有任何问题,其中“const void*buf”(第二个参数)是以二进制模式打开的文件的文件描述符(fopen(“C:\example.mp3”,“rb”))?send的参数必须指向内存缓冲区,并填充要发送的值(字节)。您可以将send()的参数const void*buf视为const char*buf——它只是字符数组,send()函数不会更改它 但是,fopen()。因此,如果要发送文件内容,应使用fread()函数和file*指针将内容读取到tmp缓冲区,然后将
send()
循环时是否有任何问题,其中“const void*buf
”(第二个参数)是以二进制模式打开的文件的文件描述符(fopen(“C:\example.mp3”,“rb”)
)?send
的参数必须指向内存缓冲区,并填充要发送的值(字节)。您可以将send()的参数const void*buf
视为const char*buf
——它只是字符数组,send()函数不会更改它
但是,fopen()。因此,如果要发送文件内容,应使用fread()
函数和file*
指针将内容读取到tmp
缓冲区,然后将tmp
缓冲区输入到send()
函数。使用fread()
和send()
重复此代码,直到到达文件末尾
示例代码(位于)
您的意思是要通过套接字发送文件内容吗?如果是这样,应该没有问题,但是您必须将文件中的数据读取到缓冲区中,然后将缓冲区中的数据传输到套接字。在Linux上,还有一个系统调用sendfile
,它实际上消除了用户空间并大大加快了速度-我将检查send
的返回值。它返回的值可能小于len
,在这种情况下,您可能希望使用tmp+r,len-r
重试,其中r
是以前发送的字节数。在Linux上,有一个系统调用splice
已过时sendfile
@user611775,我检查了splice系统调用。它的主人没有把它标记为过时。此外,glibc将正确地翻译它,大多数用户不会直接进行系统调用(但我会),而是使用glibc。
int file2socket (FILE *fp, int sockfd)
{
char tmp[8*1024];
int len;
int ret;
for (ret = 0;;) {
len = fread (tmp, 1, sizeof (tmp), fp);
if (len == 0) {
ret = feof (fp);
break;
}
if (!send (sockfd, tmp, len, 0)) break;
}
return (ret);
}