发送二进制数据

joh*_*ena 6 c sockets binary

有没有问题做一个循环,send()其中" const void *buf"(第二个参数)是打开为二进制模式(fopen("C:\example.mp3", "rb"))的文件的文件描述符?

osg*_*sgx 5

send必须指向内存缓冲区的参数,填充了要发送的值(字节).您可以将const void *bufsend()的参数视为const char *buf- 它只是chars数组,send()函数不会更改.

但是,fopen()返回给你FILE*- 它是一个指向特殊结构的指针FILE.因此,如果要发送文件的内容,则应tmp使用fread()函数和FILE*指针读取要缓冲的内容,然后将tmp缓冲区提供给send()函数.用fread()&重复此代码,send()直到您到达文件结尾.

示例代码(可在http://developerweb.net/viewtopic.php?pid=28854找到)

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 我会检查`send`的返回值.它可能返回一些小于'len`的值,在这种情况下你想要用`tmp + r,len -r`重试,其中`r`是先前发送的字节数. (3认同)