2016-02-03 50 views
0

我簡單地編寫了服務器程序來接收數據表單客戶端。我有點不明白什麼有時我得到錯誤讀取tcp4 IP:端口輸入/輸出超時從功能 int, err := conn.Read([]byte)事件時間設置功能SetDeadline()未被超過。我介紹了我的代碼的一部分,但我認爲這將是足夠的。去。在服務器程序中獲取錯誤I/O超時

我收到數據的主循環如下。

c := NewClient() 
c.kickTime: time.Now() 
func (c *Client) Listen(){ 

    durationToClose := time.Minute*time.Duration(5), 
    c.conn.SetDeadline(c.kickTime.Add(c.durationToClose)) 
    buffer := make([]byte, 1024) 
     for{ 
      reqLen, err := c.conn.Read(buffer) 
      if err != nil || reqLen == 0 { 
       fmt.Printf(err) 
       break 
      } 
      if err = c.CheckData(buffer) ; err != nil{ 
      fmt.Printf("something is bad") 
      }else{ 
      result := c.PrepareDataToSendInOtherPlace(buffer) 
      go c.RecievedData(result) 

      } 
      c.conn.SetDeadline(c.kickTime.Add(c.durationToKick)) 
     } 
} 

對我來說只是懷疑可能是附加功能爲PrepareDataToSendInOtherPlace() , CheckData()這可能需要一段時間的CPU,然後新的數據是由客戶端發送和服務器的時間做別的事情,並拒絕連接。這只是我的假設,但我不確定。

回答

1

不考慮語法錯誤和未聲明的變量,您向我們展示的內容不可能無限期地前進讀/寫最後期限。

可以運行的最長時間是在第一個time.Now()c.kickTime.Add(c.durationToKick))之後的固定持續時間。你可能想要這樣的東西:

c.conn.SetDeadline(time.Now().Add(c.durationToKick)) 
+0

你有權利。謝謝 :) – Mbded

相關問題