情況:我在c中創建一個服務器守護進程接受大量的同時連接,並且客戶端將發送數據到服務器。我目前有每個客戶端連接被催生成一個新的線程。排隊recv在服務器連接
問題:如果客戶非常迅速發送的內容衆多的線(例如,在不到一秒鐘的10行數據),服務器會看到前兩行,而不是休息。
問題:如何對來自客戶端的數據進行「排隊」(c中的recv
命令)?這是select
或poll
將需要什麼?基本上,我想確保任何客戶端能夠非常快速地發送大量數據,而不必擔心會丟失任何內容。這怎麼能實現?
示例代碼:(注意:下面的代碼顯然被大量修改,尤其通過移除錯誤檢查我想修改我的代碼,以便使問題/解決方案清楚沒有語義陷入困境無關緊要的部分。請不要被抓到了這裏的任何非標準或缺少的元素)
//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
}
}
應該讀的recv「(的sizeof BUF)-1」,以便留有餘地終止空? mystruct是malloced,我認爲?你沒有定義'行'是什麼,但是通常在一秒鐘內(甚至100毫秒)10行文本很慢 - 你的recv()循環應該很容易跟上,(除非有數百個同時連接的繁忙客戶端)。 – 2011-12-20 11:24:14