2011-12-20 67 views
0

情況:我在c中創建一個服務器守護進程接受大量的同時連接,並且客戶端將發送數據到服務器。我目前有每個客戶端連接被催生成一個新的線程。排隊recv在服務器連接

問題:如果客戶非常迅速發送的內容衆多的線(例如,在不到一秒鐘的10行數據),服務器會看到前兩行,而不是休息。

問題:如何對來自客戶端的數據進行「排隊」(c中的recv命令)?這是selectpoll將需要什麼?基本上,我想確保任何客戶端能夠非常快速地發送大量數據,而不必擔心會丟失任何內容。這怎麼能實現?

示例代碼:(注意:下面的代碼顯然被大量修改,尤其通過移除錯誤檢查我想修改我的代碼,以便使問題/解決方案清楚沒有語義陷入困境無關緊要的部分。請不要被抓到了這裏的任何非標準或缺少的元素)

//this function handles the threads 
void *ThreadedFunction(void *arg) { 
    // do some stuff, like: pull vars out of mystruct 
    int nbytes; 
    char buf[256]; 
    while(1) { 
     if((nbytes=recv(conid, buf, sizeof buf, 0)) <= 0) { 
      //handle break in connection 
     } else { 
      //for this example, just print out data from client to make my point 
      buf[nbytes] = 0; 
      printf("%s\n",buf); 
     } 
    } 
} 

//main just sets up the connections and creates threads 
int main(int argc. char *argv[]) 
{ 
    // bind(), listen(), etc... blah blah blah 

    while(1) { 
     conid = accept(...); //get a connection 
     // ... build mystruct to pass vars to threaded function ... 
     pthread_t p; 
     pthread_create(&p,NULL,ThreadedFunction,&mystruct); //create new thread 
    } 
} 
+0

應該讀的recv「(的sizeof BUF)-1」,以便留有餘地終止空? mystruct是malloced,我認爲?你沒有定義'行'是什麼,但是通常在一秒鐘內(甚至100毫秒)10行文本很慢 - 你的recv()循環應該很容易跟上,(除非有數百個同時連接的繁忙客戶端)。 – 2011-12-20 11:24:14

回答

0

你並不需要「排隊」中的數據從客戶端進來。 因爲TCP會爲你做。如果服務器速度太慢而無法爲TCP接收緩衝區留出空間,則TCP的流量控制甚至會降低客戶端速度。

所以,可能是服務器或客戶端的代碼有bug。也許客戶端在每行的末尾發送'\ 0'。在這種情況下,下面的代碼不會打印所有行:

if((nbytes=recv(conid, buf, sizeof buf, 0)) <= 0) { 
    //handle break in connection 
} else { 
    //for this example, just print out data from client to make my point 
    buf[nbytes] = 0; 
    printf("%s\n",buf); 
} 

它甚至預計,2號線是最後一行你所看到的,如果客戶端發送「\ 0」在每行的末尾。

例如:

如果客戶端發送下列行:

"abc\n\0" 
"def\n\0" 
"ghi\n\0" 

TCP通常會發送這些通過使用兩個數據包,它含有以下內容:

"abc\n\0" 
"def\n\0ghi\n\0" 

服務器通常需要2 recv調用來接收傳入的數據。 所以,你的服務器將使用2打印電話:

printf("%s\n", "abc\n\0\0"); 
printf("%s\n", "def\n\0ghi\n\0\0"); 

而結果輸出爲:

abc 
def 
+0

傻傻的我;我從來沒有想過要考慮發送者可能會在每行之後附加'\ 0'。 – cegfault 2011-12-20 21:34:31