2011-02-17 8 views
6

send() döngüsünde herhangi bir sorun var mı, "const void *buf" (2. argüman), ikili mod (fopen("C:\example.mp3", "rb")) olarak açılan bir dosyanın dosya tanıtıcısı mı?İkili veri gönderme

+1

Eğer soket üzerinde dosyasının içeriğini göndermek istiyor ifade ediyor mu? Eğer öyleyse, sorun olmamalı, ancak verileri dosyadan bir arabelleğe okumanız ve daha sonra tampondaki verileri sokete iletmeniz gerekiyor. –

cevap

5

send numaralı argüman, göndermek istediğiniz değerlerle (bayt) dolu bellek arabelleğini işaret etmelidir. const void *buf argümanını const char *buf olarak gönderebilirsiniz - sadece bir dizi karakterdir, bu da send() işlevi tarafından değiştirilmeyecektir.

fopen(), size bir FILE* değerini döndürür - bu özel yapı FILE'un bir işaretçisidir. Bu nedenle, eğer dosyanın içeriğini göndermek istiyorsanız, içeriği& FILE* işaretçisi kullanarak tmp arabelleğine okuyup işaretleyin ve tmp arabelleğini send() işlevine iletin. Bir dosya sonuna ulaşana kadar bu kodu fread() & send() ile tekrarlayın. (http://developerweb.net/viewtopic.php?pid=28854 adresinde bulunmaktadır)

Örnek kod

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

Linux'ta, kullanıcı alanını gerçekten ortadan kaldıran ve işleri çok hızlandıran bir "sendfile" sistemi çağrısı var - http://www.kernel.org/doc/man-pages/online/pages/man2/sendfile.2. html –

+3

"Gönder" öğesinin dönüş değerini kontrol ederim. 'Len' değerinden daha düşük bir değer getirebilir, bu durumda 'tmp + r, len - r' ile tekrar denemek isteyebilirsiniz, burada r 'daha önce gönderilen bayt sayısıdır. – asveikau

+0

Linux'ta 'sendfile' işlevini kaldıran bir sistem çağrısı var. – user611775