C/C++ windows socket 客戶端檢測斷線重連的常用方法應該主要幾種:
1.使用自帶的keep alive
這種方法的話請問客戶端能通過什么途徑來獲取斷線的時機或事件么?
2.recv回傳值判斷
這種方法能識別的情況是有限的
3.實作心跳
這種方法一般要創建一個執行緒來專門計時發送心跳包,如果不創建執行緒,請問可以用這種方法么?
如果必須要創建執行緒的話,盡量不選用這種方法(方案限制)
uj5u.com熱心網友回復:
合適的才是好的,這個你客戶端有要求盡量不用執行緒,服務器沒有這個要求,可以在服務器實作單向心跳,客戶端接收訊息,超過心跳時間就代表己經斷線。客戶端再接收訊息時再統一處理心跳和資料,這樣可以不創建執行緒。uj5u.com熱心網友回復:
客戶端需要向服務端發資料,并recv 服務端的反饋,根據反饋采取對應方式。發送時有特定執行緒。
在這個執行緒應該也不合適接收心跳包吧?
uj5u.com熱心網友回復:
心跳服務器定時發送,你并不一定要一直接收,接收反饋的時候,順便處理就可以了,不需要單開執行緒
uj5u.com熱心網友回復:
合適的才是好的,這個你客戶端有要求盡量不用執行緒,服務器沒有這個要求,可以在服務器實作單向心跳,客戶端接收訊息,超過心跳時間就代表己經斷線。客戶端再接收訊息時再統一處理心跳和資料,這樣可以不創建執行緒。
客戶端需要向服務端發資料,并recv 服務端的反饋,根據反饋采取對應方式。發送時有特定執行緒。
在這個執行緒應該也不合適接收心跳包吧?
心跳服務器定時發送,你并不一定要一直接收,接收反饋的時候,順便處理就可以了,不需要單開執行緒
使用心跳監控的目的是想在斷開時,客戶端自動觸發重連,然后繼續傳輸資料。
keepalive好像是心跳超時自動會清楚掉一些資源,無法控制它重連是么?
另外上面說的客戶端接收反饋時順便處理心跳包,這個也是需要有timer 判斷超時的吧?不起執行緒能行么
uj5u.com熱心網友回復:
合適的才是好的,這個你客戶端有要求盡量不用執行緒,服務器沒有這個要求,可以在服務器實作單向心跳,客戶端接收訊息,超過心跳時間就代表己經斷線。客戶端再接收訊息時再統一處理心跳和資料,這樣可以不創建執行緒。
客戶端需要向服務端發資料,并recv 服務端的反饋,根據反饋采取對應方式。發送時有特定執行緒。
在這個執行緒應該也不合適接收心跳包吧?
心跳服務器定時發送,你并不一定要一直接收,接收反饋的時候,順便處理就可以了,不需要單開執行緒
使用心跳監控的目的是想在斷開時,客戶端自動觸發重連,然后繼續傳輸資料。
keepalive好像是心跳超時自動會清楚掉一些資源,無法控制它重連是么?
另外上面說的客戶端接收反饋時順便處理心跳包,這個也是需要有timer 判斷超時的吧?不起執行緒能行么
不用timer,socket發送訊息,你不一定要馬上接收,沒有接收的會在快取中,當你需要接收訊息時,再去分解收到的訊息,是心跳的跳過,不是心跳的就是你需要的反饋,假定服務器十秒鐘發送一次心跳,你沒有收到反饋,也沒有在十秒鐘收到心跳,就代表斷線了。你的recv看是同步處理的還是異步處理的,根據情況做下處理就可以了。
uj5u.com熱心網友回復:
合適的才是好的,這個你客戶端有要求盡量不用執行緒,服務器沒有這個要求,可以在服務器實作單向心跳,客戶端接收訊息,超過心跳時間就代表己經斷線。客戶端再接收訊息時再統一處理心跳和資料,這樣可以不創建執行緒。
客戶端需要向服務端發資料,并recv 服務端的反饋,根據反饋采取對應方式。發送時有特定執行緒。
在這個執行緒應該也不合適接收心跳包吧?
心跳服務器定時發送,你并不一定要一直接收,接收反饋的時候,順便處理就可以了,不需要單開執行緒
使用心跳監控的目的是想在斷開時,客戶端自動觸發重連,然后繼續傳輸資料。
keepalive好像是心跳超時自動會清楚掉一些資源,無法控制它重連是么?
另外上面說的客戶端接收反饋時順便處理心跳包,這個也是需要有timer 判斷超時的吧?不起執行緒能行么
不用timer,socket發送訊息,你不一定要馬上接收,沒有接收的會在快取中,當你需要接收訊息時,再去分解收到的訊息,是心跳的跳過,不是心跳的就是你需要的反饋,假定服務器十秒鐘發送一次心跳,你沒有收到反饋,也沒有在十秒鐘收到心跳,就代表斷線了。你的recv看是同步處理的還是異步處理的,根據情況做下處理就可以了。
這個是因為想保證資料發送的可靠性,是想要發送一次資料,recv一次的,如果反饋正常才發下一個,否則要重發的。
中間還要處理心跳,發現斷線還要重傳。按照你說的話,這些都應該放在一起處理了。
所以從設計上跟常用的方法不太一樣。。。
uj5u.com熱心網友回復:
合適的才是好的,這個你客戶端有要求盡量不用執行緒,服務器沒有這個要求,可以在服務器實作單向心跳,客戶端接收訊息,超過心跳時間就代表己經斷線。客戶端再接收訊息時再統一處理心跳和資料,這樣可以不創建執行緒。
客戶端需要向服務端發資料,并recv 服務端的反饋,根據反饋采取對應方式。發送時有特定執行緒。
在這個執行緒應該也不合適接收心跳包吧?
心跳服務器定時發送,你并不一定要一直接收,接收反饋的時候,順便處理就可以了,不需要單開執行緒
使用心跳監控的目的是想在斷開時,客戶端自動觸發重連,然后繼續傳輸資料。
keepalive好像是心跳超時自動會清楚掉一些資源,無法控制它重連是么?
另外上面說的客戶端接收反饋時順便處理心跳包,這個也是需要有timer 判斷超時的吧?不起執行緒能行么
不用timer,socket發送訊息,你不一定要馬上接收,沒有接收的會在快取中,當你需要接收訊息時,再去分解收到的訊息,是心跳的跳過,不是心跳的就是你需要的反饋,假定服務器十秒鐘發送一次心跳,你沒有收到反饋,也沒有在十秒鐘收到心跳,就代表斷線了。你的recv看是同步處理的還是異步處理的,根據情況做下處理就可以了。
這個是因為想保證資料發送的可靠性,是想要發送一次資料,recv一次的,如果反饋正常才發下一個,否則要重發的。
中間還要處理心跳,發現斷線還要重傳。按照你說的話,這些都應該放在一起處理了。
所以從設計上跟常用的方法不太一樣。。。
你的要求本身就和正常的不一樣,要開心跳還不能另開執行緒,不放在一起處理能實作嗎
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/133587.html
標籤:C++ 語言
