2014-02-20 30 views
0

我用epoll的在我的服務器,當我「模擬」負載sleep(2)非阻塞套接字(TCP)緩衝味精處理逐個

Client send: a 
Client send: b 
Client send: c 

Server recv: abc 

但是,我想:

Server recv: a 
Server recv: b 
Server recv: c 

因爲我使用weboscket框架,而且我想處理的是一個接一個。

我需要手動分割緩衝區?還是有更合乎邏輯的解決方案?

static const size_t RECV_BUFFER_SIZE = 1024; 

size_t tcp_recv(int fd, char **buffer) 
{ 
    size_t buffer_size = RECV_BUFFER_SIZE; 
    size_t buffer_data_len = 0; 

    *buffer = (char *)malloc(buffer_size); 

    for (;;) { 
     //sleep(2); 
     ssize_t len; 

     len = recv(fd, *buffer + buffer_data_len, 
      buffer_size - buffer_data_len, 0); 
     buffer_data_len += len; 

     if (len == -1) 
      break; 

     if (len == buffer_size - buffer_data_len) { 
      char *new_buffer; 

      buffer_size *= 2; 
      new_buffer = (char *)realloc(*buffer, buffer_size); 
      if (new_buffer != NULL) 
       *buffer = new_buffer; 
     } 
    } 

    (*buffer)[buffer_data_len] = '\0'; 
    return buffer_data_len; 
} 

回答

2

您需要在流式TCP協議之上實現自己的協議。

兩種可能的方法是:

  1. 首先發送的數據的長度進來固定長度格式,然後發送的字節的正是這種量。
  2. 定義一個分隔符序列,用於終止具有任意長度的數據塊。對於文本數據,這可以是例如新行序列,即由http協議使用的\r\n
+0

客戶端由瀏覽器實現,所以我不能更改協議。但是,ws頭包含數據長度,所以我可以計算幀大小,並逐個處理緩衝區的部分,這很好。我希望有另一種方式。 – bsz