2011-02-17 16 views
6

¿Hay algún problema al hacer un bucle de send() donde "const void *buf" (2do argumento) es un descriptor de archivo de un archivo abierto como modo binario (fopen("C:\example.mp3", "rb"))?Envío de datos binarios

+1

¿Quiere decir que desea enviar el contenido del archivo a través de la toma de corriente? Si es así, no debería haber ningún problema, pero debe leer los datos del archivo en un búfer, luego transmitir los datos en el búfer al zócalo. –

Respuesta

5

El argumento de send debe señalar a la memoria intermedia, llenada con los valores (bytes) que desea enviar. Puede tratar el argumento const void *buf de send() como const char *buf - es solo una matriz de caracteres, que no será modificada por la función send().

Pero, fopen() le devuelve un FILE* - es un puntero a la estructura especial FILE. Por lo tanto, si desea enviar el contenido del archivo, debe leer los contenidos en el búfer tmp utilizando el fread() función & FILE* puntero, y luego alimentar el tmp búfer a la función . Repita este código con fread() & send() hasta que llegue a un final de archivo.

Código de la muestra (que se encuentra en 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); 
} 
+0

En Linux, también hay una llamada al sistema 'sendfile' que en realidad elimina el espacio del usuario y acelera mucho las cosas: http://www.kernel.org/doc/man-pages/online/pages/man2/sendfile.2. html –

+3

Verificaría el valor de retorno de 'send'. Puede devolver algún valor menor que 'len', en cuyo caso querrá volver a intentar con' tmp + r, len -r' donde 'r' es la cantidad de bytes enviados previamente. – asveikau

+0

En Linux, hay una llamada al sistema 'empalme' que obsoleta' sendfile'. – user611775