2012-05-18 40 views
0

。 我幾乎所有的,但今天我注意到,有一個主要問題。
我得到了服務器發送給我的所有數據,但如果我在顯示發送給我的數據後不做任何事情,我的while(1)循環只會檢查一次,如果有更多數據要接收然後停止。只有當我鍵入併發送一些內容時纔會重新開始,而不是在發送我輸入的內容之後它會檢查是否有任何數據在套接字上等待並最終顯示它。
這顯然是錯誤的,因爲在這種情況下,我看到以前發送的消息,只有當我發送了一些東西。
這是我的代碼:如何實現實現IRC客戶端(靜態)的無限循環

while(1){  
    if((readReady = readReadiness(sockfd))==0){ //nothing to recv 
      if(((writeReady = writeReadiness(sockfd))>0) && (readReady = readReadiness(sockfd))==0){ //sending is possible 
       (data sending part...) 
      } 
      else 
       continue; //if there s no data to read and cant send 
      } 
    else{   //if there s some data to recv() on the socket buffer 
      (parsing and receiving data part...) 
    } 
    continue; 
} 

readReadiness()writeReadiness()使用select()來檢查是否有任何Ş數據接收或可能把一些。

問題是:如何使無限循環,將重複檢查是否有任何數據接收,即使我什麼都不做無盡。 ? (while(1)停止檢查,直到我再次發送東西)
我試圖使用fork(),但我不知道如何使它工作和數據池,同時仍然給我的可能性發送/接收和顯示它。

+0

當我看到問題標題我雖然這將是一個容易回答。 – Dabbler

+0

這是一種非常扭曲的做事方式。人們通常圍繞_single_ select呼叫進行循環。看起來你每次可以做三次,邏輯看起來非常脆弱。 – Mat

+0

它在連鎖收發收等工作出色。所以邏輯不是很脆弱。問題是如何改變它或使用什麼函數使其能夠像接收 - 接收 - 接收 - 發送 - 接收 - 發送 - 接收 - 接收等一樣工作... – azrahel

回答

0

在while(1)循環中,您可以定期向服務器「戳」新內容。該響應將更新您的套接字的內容。這將觸發有數據recv()在套接字緩衝區...

+0

想到這樣做,但您承認這似乎是一個野蠻的解決方案。我想到的第一件事是 - 如果我的while循環停止,我如何定期戳它?如果我可以定期戳到比我經常檢查是否有任何數據要收到;) 所以我看到它 - 它沒有解決任何問題。 – azrahel

+0

你可以使用while(1 = 1)來確保你有一個無限循環。你的while(1)可以被解釋爲只做一次。然後使用睡眠(時間以毫秒爲單位)。這將迫使線程等待。然後將一些東西添加到將被您忽略的套接字中,並檢查是否有更多的數據要顯示。是的,我知道這不是他最好的辦法。 – Minus

+0

我只是想。 IRC服務器如何向您發送數據。定期或者你必須要求數據? – Minus