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
cevap
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);
}
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 –
"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
Linux'ta 'sendfile' işlevini kaldıran bir sistem çağrısı var. – user611775
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. –