網(wǎng)絡編程中的超時檢測詳細過程說明[2]

互聯(lián)網(wǎng)技術(shù) 責任編輯:leton2008 2011-01-10

摘要:if(SELECT(sockfd+1,&rdfds,NULL,NULL,&tv)==0){超時處理}……三、設(shè)置定時器這種方法的原理是在從套接字接收數(shù)據(jù)之前先設(shè)置8秒鐘的定時器。如果8秒鐘內(nèi)沒有數(shù)據(jù)到來,內(nèi)核產(chǎn)生的SIGALRM信號會中斷當前的讀操作。我們知道設(shè)置信號捕捉函數(shù)可以用signal函數(shù)或是sigaction函數(shù)。但這里只能使用sig

  if (SELECT(sockfd+1, &rdfds, NULL, NULL, &tv) == 0)

  {

  超時處理

  }

  ……

  三、 設(shè)置定時器

  這種方法的原理是在從套接字接收數(shù)據(jù)之前先設(shè)置8秒鐘的定時器。如果8秒鐘內(nèi)沒有數(shù)據(jù)到來,內(nèi)核產(chǎn)生的SIGALRM信號會中斷當前的讀操作。我們知道設(shè)置信號捕捉函數(shù)可以用signal函數(shù)或是sigaction函數(shù)。但這里只能使用sigaction函數(shù),因為signal設(shè)置的信號處理函數(shù)執(zhí)行完后會重新執(zhí)行被中斷的操作。參考代碼如下:

  void handler(int signo) // 自定義SIGALRM信號處理函數(shù)

  {

  return;

  }

  struct sigaction act; // 描述信號行為的變量

  ……

  sigaction(SIGALRM, NULL, &act); // 獲取SIGALRM信號的屬性

  act.sa_handler = handler; // 設(shè)置SIGALRM信號的處理函數(shù)

  act.sa_flags &= ~SA_RESTART; // 關(guān)閉重啟被中斷操作的選項

  sigaction(SIGALRM, &act, NULL); // 設(shè)置SIGALRM信號的屬性

  alarm(8); // 設(shè)置8秒鐘的定時器

  ……

  雖然我們是以套接字的讀操作為例,實際上在很多類似的情況中,大家都可以酌情采取上面介紹的方法。巧妙的運用所學知識會讓你的程序更加靈活和人性化。

[1]  [2]  

更多資料
更多課程
更多真題
溫馨提示:因考試政策、內(nèi)容不斷變化與調(diào)整,本網(wǎng)站提供的以上信息僅供參考,如有異議,請考生以權(quán)威部門公布的內(nèi)容為準!

通信工程師備考資料免費領(lǐng)取

去領(lǐng)取

距離2025 通信工程師考試

還有
  • 3
  • 1
  • 1
專注在線職業(yè)教育23年

項目管理

信息系統(tǒng)項目管理師

廠商認證

信息系統(tǒng)項目管理師

信息系統(tǒng)項目管理師

!
咨詢在線老師!