2011-01-22 61 views
2

我想在C中編寫代碼,其中我想從套接字讀取數據,但我不知道數據的長度。我無法控制數據發件人。套接字讀取和未知長度的數據

是否有任何方式讀取使用未知長度讀取套接字讀取?

以下是我編寫的代碼,但它掛在read()

static void 
process_command (int fd) { 
    fprintf (stderr, "process_command\n"); 
    char *buffer = (char *) malloc (sizeof (char) * SIZE_TO_READ); 
    int n = 0; 
    while (1) { 
     fprintf (stderr, "."); 
     n = read (fd, buffer, SIZE_TO_READ); 
     fprintf (stderr, "bytes read = %d \n", n); 
     if (n <= 0 || n == -1) 
      break; 
     buffer = (char *) realloc (buffer, n + SIZE_TO_READ); 
    } 
    char * p = strchr (buffer, '\n'); 
    if (p) *p = '\0'; 
    fprintf (stderr, "-----> %s\n", buffer); 
    if (buffer) free (buffer); 
} 

FD在這種情況下是FILENO_STDIN

+1

將`realloc()`的結果賦值給與其參數相同的變量是不安全的,因爲分配可能會失敗(在這種情況下,您將泄漏舊的緩衝區)。另外,你對`strchr()`的使用對我來說看起來並不安全。 – 2011-01-22 19:21:19

+0

謝謝,我會修復這個問題 – Avinash 2011-01-22 19:22:11

回答

1

在調用socket()(或稍後調用fcntl()O_NONBLOCK)後通過SOCK_NONBLOCK使套接字操作無阻塞。如果沒有要讀取的數據(尚未),這將導致read()調用與EAGAIN或EWOULDBLOCK(實際上是相同的)失敗。

或者,您可以使用select()來確定是否有任何數據準備在實際的read()調用之前在特定套接字上讀取。

5

僅由一些塊(緩衝器),直到它返回0,否則你會看到有根據協議的數據的結束讀取。

+1

並且當內部和虛擬內存都滿時顯示錯誤。不要只是崩潰。 – 2011-01-22 18:57:27

2

沒有辦法知道有多少字節是不尋常的。大多數協議都有一些指定數據長度或數據終結符的方法。你準確實施什麼樣的協議?

相關問題