[請益] 請教socket_recv收訊息不完整問題

看板PHP作者 (阿達)時間12年前 (2013/08/17 13:01), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串1/1
小的PHP經驗不超過半年! 雖然問題解決了 但是想請教熟的人這到底是啥原因 以及比較好的做法為何? 先感謝~~ <(_::_)> 首先已確定透過socket送給我PHP程式訊息的Server確實是一大包訊息一次送出 問題一開始是我發現透過像這樣的方法收訊息 if (($bytes=socket_recv($socket,$buf,$dataLength,MSG_WAITALL))!==false) { if ($bytes < $dataLength) { // 寫log紀錄訊息不完整 } // 把收到的訊息$buf轉送回介面前端 echo $buf; } == $dataLength 是我透過帶在訊息前面的Header知道後面資料有多長 常常會發生, 比如長度說是12345 但是我只有收到不完整的4200或者9600之類的 所以我想請教的第一個問題是 是甚麼原因讓socket_recv參數帶MSG_WAITALL卻收到一半就吐給我? 接下來我因為沒有收到全部訊息 所以我把Code改成這樣 $timeoutLimit = 5; // 5s $startTime = time(); // 讀取資料 while (true) { if (($bytes=socket_recv($socket,$buf,$dataLength,MSG_WAITALL))!==false) { $backMsg = $backMsg . $buf; } if (strlen($backMsg) >= $dataLength) { break; } elseif ((time() - $startTime) > $timeoutLimit) { // Timeout 將現有的資料回傳. WriteToLog('[Timeout: ....... '); break; } } echo $backMsg; 就可以收到全部資料再回傳了 我的第二個問題是 有比較好或者說比較正確的做法嗎? 非常感謝!!! -- . ______ ◥█◣▲◢█◤ ◥ ◥GRAVEYARD. \◤◥█◤◥◤ ◤ ' \ BILE DEMON'◥◥◤◤ ◢▌  ̄ ̄ ̄ ̄ ̄ ̄ █▌ ◣ ◥▌ ◢◢//\ ●● ◥◥ ◤◥ ◤◤◣◣ ▃▇ ▆◣▂◢▂▅█▄ USHER -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 175.182.40.103
文章代碼(AID): #1I3mEP8v (PHP)
文章代碼(AID): #1I3mEP8v (PHP)