回覆列表
  • 1 # 使用者9220574199940

    法一:當recv()返回值小於等於0時,socket連線斷開。但是還需要判斷errno是否等於EINTR,如果errno==EINTR則說明recv函式是由於程式接收到訊號後返回的,socket連線還是正常的,不應close掉socket連線。法二:structtcp_infoinfo;intlen=sizeof(info);getsockopt(sock,IPPROTO_TCP,TCP_INFO,&info,(socklen_t*)&len);if((info.tcpi_state==TCP_ESTABLISHED))則說明未斷開else斷開法三:若使用了select等系統函式,若遠端斷開,則select返回1,recv返回0則斷開。其他注意事項同法一。法四:intkeepAlive=1;//開啟keepalive屬性intkeepIdle=60;//如該連線在60秒內沒有任何資料往來,則進行探測intkeepInterval=5;//探測時發包的時間間隔為5秒intkeepCount=3;//探測嘗試的次數.如果第1次探測包就收到響應了,則後2次的不再發.setsockopt(rs,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive));setsockopt(rs,SOL_TCP,TCP_KEEPIDLE,(void*)&keepIdle,sizeof(keepIdle));setsockopt(rs,SOL_TCP,TCP_KEEPINTVL,(void*)&keepInterval,sizeof(keepInterval));setsockopt(rs,SOL_TCP,TCP_KEEPCNT,(void*)&keepCount,sizeof(keepCount));設定後,若斷開,則在使用該socket讀寫時立即失敗,並返回ETIMEDOUT錯誤

  • 中秋節和大豐收的關聯?
  • 大家說迪斯尼動畫《長髮公主》裡的男主尤金長的怎麼樣?帥嗎?