看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《gn00618777 (非常念舊)》之銘言: : 我知道在 main(int argc, char*argv){ : } : 可以傳外部參數進去例如 xxx.exe "參數" : 但如果我在 main 裡面有一個無窮迴圈 while : while 裡面我該如何獲得外面傳進來的參數呢??(假設這個無窮迴圈不能read file) : 短時間內想不出來="= : 謝謝指教 我把我自己伺服器用的TCP and Unix domain Socket IPC整理在github上 https://github.com/hn12404988/Neural_Socket 這個專案的目的是「輕量,高效,穩定」的IPC,所以選擇TCP socket 和 Unix Domain 另外目前只有在Linux上測試而已,OSX我猜應該沒問題,windows可能就要改寫一些地方 server特色: 每個connection有自己的thread獨立運作,意思就是,一個server可以被好幾個client連接 每個thread接收自己的訊息,不會在開thread處理,所以處理完這個訊息回覆後,才會處理 下一個進來的訊息,如果connection被client關掉或是不明原因中斷連線,server會自己回收 掉那個thread client特色: 一個client可以同時跟好幾個server保持連線,需要設定一個最大連線數,如果滿了之後, 又有新的server要連線,client會關掉最少用的連線,然後加入新的。 除了傳統的「傳送然後接收」,還有「射後不理」,就是client發送訊息後,就開一個新的 thread自己去接收不重要的回覆,不會影響main thread運作。 「射後不理」不用擔心如果server處理太慢,或是client射太快,server有可能一次把兩次 的訊息一次讀取進去,因為client如果知道上一個「射後不理」還沒收到server的回傳 client會把新的訊息先存起來,等到上一個回來了,就會把訊息在馬上送出去 Note: 可以看得出來,server不管怎樣一定要回傳訊息,不然會拖慢到client的速度,雖然最終 client都會放棄沒有訊息回傳的溝通,但會嚴重影響效能。 其他細節請看example檔案,自己compile跑看看,如果有問題請在跟我說,或github上issue -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.133.16.181 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1472613117.A.414.html
steve1012: 蠻多raw pointer 都用C++11 應該可以減少一點 08/31 11:44
steve1012: 感覺命名可以稍微改一下 可讀性較好 像jkl vector 另外 08/31 11:46
steve1012: 感覺你非常多vector 可以考慮把一些東西包起來 08/31 11:46
steve1012: 像是ip_list port_list等 用個ds包起來可能比較好理解 08/31 11:48
steve1012: 多提供點abstraction 讓使用者能了解high level idea 08/31 11:48
steve1012: 然後jk 這種變數實在太多了xD 感謝你花時間貼上來 很 08/31 11:48
steve1012: 厲害 08/31 11:48
hn12404988: raw pointer有點個人怪癖,有點難改,jk是指什麼? 08/31 12:13
hn12404988: 你是指我用來記數的int j,k嗎?不然就要改成 08/31 12:24
hn12404988: 在function裡宣告,這樣每次執行都要再配新記憶體位置 08/31 12:25
hn12404988: 會影響到一丁點效能就是了,習慣要用的東西先全部宣告 08/31 12:26
Caesar08: 又不是用new出來的,i j k這種放for loop裡面就好 08/31 12:31
Caesar08: 然後你居然在socket_client.h裡面include cpp 08/31 12:32
Caesar08: pimpl學一下,就不用include那麼多header 08/31 12:33
Caesar08: 然後寫C++的話,pointer幾乎都用不到 08/31 12:35
Caesar08: 都用c++11,unique_ptr會比較好 08/31 12:36
hn12404988: 感謝,我不知道pimpl,我都這樣include而已,等等去查 08/31 12:37
hn12404988: raw pointer實在是個人怪癖,我控制欲對pointer很強 08/31 12:38
Caesar08: 然後你的inline應該用錯了 08/31 12:40
askacis: Linux 上用 socket做IPC,不用domain socket而用tcp的理 08/31 13:14
askacis: 由是? 08/31 13:14
hn12404988: 有domain socket的,這是我從我自己用的分割出來的 08/31 14:26
hn12404988: TCP比較通用,就把TCP的分割出來 08/31 14:26
hn12404988: inline我真的是亂用,因為我上次查,比較新compiler 08/31 14:27
hn12404988: 會自己判斷要不要inline是否會加快效能,不是人決定的 08/31 14:28
hn12404988: 所以inline就隨便寫 08/31 14:28
askacis: 不過unix domain socket理論上效率會比tcp socket好, 08/31 18:12
askacis: 不過不知道新版kernel是不是有對loopback最佳化 08/31 18:13
hn12404988: 之後再花一些時間整理,把unix socket也加到這專案 08/31 18:48
steve1012: Raw pointer 除了更危險一點看不出來有啥差別.... 08/31 21:09
steve1012: 你這裡面有哪件事情是shared Ptr做不到的嗎 08/31 21:10
steve1012: 簡單來說就是要寫給別人用的東西這樣寫有點糟 當然要是 08/31 21:11
steve1012: 自己用可能沒差 08/31 21:11
steve1012: 用的人哪知道jkl是什麼 會影響到什麼 08/31 21:11
hn12404988: 沒寫過給別人,看來這些習慣要改一改,之後順便用 08/31 22:05
hn12404988: 一般i,j,k這種記數用的,有甚麼好的名稱或包裝方式嗎 08/31 22:06
Caesar08: i j k通常都是用來做為subscript,一看就知道是做甚麼了 08/31 23:22
steve1012: 重點是計數器不用寫成data member吧 09/01 03:39
steve1012: 而且雖然一看就知道 但是並不知道是給誰用的 這麼多個v 09/01 03:40
steve1012: ector 是要index誰 09/01 03:40
※ 編輯: hn12404988 (220.133.16.181), 09/02/2016 08:22:52