2011-02-17 12 views
6

क्या send() का लूप करने में कोई समस्या है जहां "const void *buf" (दूसरा तर्क) बाइनरी मोड (fopen("C:\example.mp3", "rb")) के रूप में खोले गए फ़ाइल का फ़ाइल डिस्क्रिप्टर है?बाइनरी डेटा भेजना

+1

तुम्हारा मतलब आप सॉकेट से अधिक फ़ाइल की सामग्री भेजने के लिए करना चाहते हैं? यदि हां, तो कोई समस्या नहीं होनी चाहिए, लेकिन आपको फ़ाइल से डेटा को बफर में पढ़ना होगा, फिर डेटा को बफर में सॉकेट में प्रेषित करना होगा। –

उत्तर

5

send का तर्क स्मृति बफर को इंगित करना चाहिए, जो मान (बाइट्स) से भरा हुआ है, जिसे आप भेजना चाहते हैं। आप const void *buf के const char *buf के रूप में const void *buf के तर्क का इलाज कर सकते हैं - यह केवल वर्णों की सरणी है, जो प्रेषण() फ़ंक्शन द्वारा नहीं बदला जाएगा।

लेकिन, fopen() आपको FILE* पर लौटाता है - यह विशेष संरचना FILE के लिए एक सूचक है। इसलिए, यदि आप फ़ाइल की सामग्री भेजना चाहते हैं, तो आपको बफर 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); 
} 
+0

लिनक्स पर, एक सिस्टम कॉल 'sendfile' भी है जो वास्तव में उपयोगकर्ता की जगह को समाप्त करता है और चीजों को बहुत गति देता है - http://www.kernel.org/doc/man-pages/online/pages/man2/sendfile.2। एचटीएमएल –

+3

मैं 'प्रेषण 'के वापसी मूल्य की जांच करूंगा। यह 'लेन' से कम कुछ मूल्य वापस कर सकता है, जिस स्थिति में आप 'tmp + r, len-r' के साथ पुनः प्रयास करना चाहते हैं, जहां 'r' पहले भेजे गए बाइट्स की संख्या है। – asveikau

+0

लिनक्स पर, एक सिस्टम कॉल 'splice' है जो अप्रचलित' sendfile' है। – user611775

संबंधित मुद्दे