[請益] 請教socket_recv收訊息不完整問題
小的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
推
08/19 11:31, , 1F
08/19 11:31, 1F
PHP 近期熱門文章
PTT數位生活區 即時熱門文章