簡體   English   中英

如何在C中將任意大文件讀取到TCP套接字?

[英]How can I read an arbitrarily large file to a TCP Socket in C?

我只是在學習套接字編程,我試圖編寫一個從stdin讀取並寫入套接字的echo客戶,然后從套接字讀取對stdout的服務器響應。 問題是我不知道stdin將持續多長時間或服務器響應將持續多長時間。 我嘗試使用的代碼如下(創建套接字並連接到服務器被忽略):

length = BUF_SIZE;
while (length == BUF_SIZE) {  // length will equal BUF_SIZE if buf is full, when length < BUF_SIZE we have reached an EOF                                 
   // Reads from STDIN to buf                                                                                                                              
   if ((length = read(STDIN_FILENO, buf, BUF_SIZE)) < 0){
     fprintf(stderr, "Error in reading from STDIN");
     return 4;
   }
   // Writes from buf to the socket                                                                                                                        
   if ((write(sock, buf, BUF_SIZE)) < 0){
     fprintf(stderr, "Error writing to socket");
     return 5;
   }
 }

if ((status = shutdown(sock, 1)) < 0){ // Shuts down socket from doing more receives                                                                      
   fprintf(stderr, "Error shutting down socket for writing");
   return 6;
}

length = BUF_SIZE; 
while (length == BUF_SIZE){
   // Read from socket to buf                                                                                                                              
   if ((length = read(sock, buf, BUF_SIZE)) < 0){
     fprintf(stderr, "Error reading from socket");
     return 7;
   }
   // Write from buf to STDOUT                                                                                                                             
   if ((write(STDOUT_FILENO, buf, BUF_SIZE)) < 0){
     fprintf(stderr, "Error writing to STDOUT");
     return 8;
   }
}

close(sock);
exit(0);

BUF_SIZE定義為100。當我運行程序時,程序通常連接到服務器並發送正確的消息,但是它寫到stdout的內容卻什么也不是。

我究竟做錯了什么?

您的while循環只會在第一次使用時起作用。 read()/ write()將僅返回其實際讀取/寫入的數量,該數量可能不等於BUF_SIZE。 假設您從套接字讀取了十個字節,然后向stdout寫入了一百個字節-最后90個將是垃圾。

這些思路可以使您更接近自己想要的東西。

while (1)
{
    if ((length = read(STDIN_FILENO, buf, BUF_SIZE)) < 0)
    {
        fprintf(stderr, "Error in reading from STDIN");
        return 4;
    }

    if ((write(sock, buf, length)) < 0)
    {
        fprintf(stderr, "Error writing to socket");
        return 5;
    }

    if ((length = read(sock, buf, BUF_SIZE)) < 0)
    {
        fprintf(stderr, "Error reading from socket");
        return 7;
    }

    if ((write(STDOUT_FILENO, buf, length)) < 0)
    {
        fprintf(stderr, "Error writing to STDOUT");
        return 8;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM