Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 发送二进制数据_C_Sockets_Binary - Fatal编程技术网

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);
}