第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

socket_read的兩個參數(shù):PHP_NORMAL_READ 和 PHP_BINARY_READ

socket_read的兩個參數(shù):PHP_NORMAL_READ 和 PHP_BINARY_READ

PHP
慕運維8079593 2019-03-16 00:15:25
簡單地拿php的socket寫了個小daemo, 代碼如下: server端:<?php $address = "127.0.0.1";$port = 20461;//創(chuàng)建socket資源$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");//阻塞模式socket_set_block($sock) or die("socket_set_block() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");//綁定到socket端口$result = socket_bind($sock, $address, $port) or die("socket_bind() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");//監(jiān)聽端口$result = socket_listen($sock) or die("socket_listen() 失敗的原因是:" . socket_strerror(socket_last_error()) . "/n");echo "OKnBinding the socket on $address:$port ... ";echo "OKnNow ready to accept connections.nListening on the socket ... n";do { $msgsock = socket_accept($sock) or die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n"); echo "Read client data \n"; $buf = socket_read($msgsock, 8192, PHP_NORMAL_READ); echo "Received msg: $buf \n"; //數(shù)據(jù)傳送 向客戶端寫入返回結(jié)果 $msg = "welcome" . PHP_EOL; socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) ."/n"); socket_close($msgsock); } while (true);socket_close($sock); client端:<?phpglobal $argv;$host = "127.0.0.1";$port = 20461;$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create socketn"); // 創(chuàng)建一個Socket$connection = socket_connect($socket, $host, $port) or die("Could not connet servern"); // 連接socket_write($socket, $argv[1] . PHP_EOL) or die("Write failedn");//$buff = socket_read($socket, 1024, PHP_NORMAL_READ);while ($buff = socket_read($socket, 1024, PHP_NORMAL_READ)) { echo("Response was:" . $buff . PHP_EOL); }socket_close($socket); 我把服務(wù)端啟動之后,客戶端發(fā)送數(shù)據(jù)會報錯:但是把客戶端的socket_read改成PHP_BINARY_READ就可以了;
查看完整描述

3 回答

?
守候你守候我

TA貢獻1802條經(jīng)驗 獲得超10個贊

我也是一樣的錯誤,你知道為啥normal就不行么

查看完整回答
反對 回復(fù) 2019-03-18
?
縹緲止盈

TA貢獻2041條經(jīng)驗 獲得超4個贊

和標(biāo)題的兩個參數(shù)都沒有關(guān)系。
和server端"socket_close($msgsock);"有關(guān)。
第一次通信之后,server端就關(guān)閉了來自client的socket。
所以會成功通信一次,然后斷開連接,自然而然后面的通信就都失敗了。

查看完整回答
反對 回復(fù) 2019-03-18
?
慕慕森

TA貢獻1856條經(jīng)驗 獲得超17個贊

主要是你循環(huán)的地方不對啦!
1.socket_read:
socket_read函數(shù)有兩種讀模式:PHP_BINARY_READ和PHP_NORMAL_READ。

string$input=socket_read(*resource*$socket,int$length[,*int*$type=PHP_BINARY_READ/PHP_NORMAL_READ]);

這兩種模式最大的不同在于對于被讀的信息的結(jié)束標(biāo)志的要求。
socket_read是一種阻塞型的函數(shù),所謂阻塞就是別的事情都不做,只做這一件事。當(dāng)read的字符串長度不長時,read可能只需要幾個微秒的執(zhí)行時間,當(dāng)字符串很長,或者read遲遲沒有返回值時,程序就會陷在read的位置,不會繼續(xù)往下執(zhí)行。
PHP手冊上對socket_read的具體介紹
PHP_BINARY_READ是默認的socket_read模式,對于結(jié)束標(biāo)志沒有固定要求,因此客戶端只需要發(fā)送信息,服務(wù)器端的socket_read讀到最后一個字符之后就會結(jié)束并返回讀到的結(jié)果。而PHP_NORMAL_READ則必須在\n、\r或者讀到的字符串長度達到參變量$length所規(guī)定的最大字符長度之后停止,并返回讀操作的結(jié)果,否則在NORMAL模式下,socket_read會阻塞程序的進行,一直等待到滿足停止read的條件出現(xiàn)為止。
因此在NOAMAL_READ模式下面進行的通信很容易會造成失步。除非每條傳輸?shù)男畔⒍荚谀┪布由弦粋€"\n"或者"\r"。
只需要在信息末尾加上換行符或者回車符,NORMAL和BINARY是差不多的。
對于這兩個程序來說,并不是客戶端發(fā)送報錯,而是服務(wù)器端讀指令不能成功結(jié)束。

2.socket_close($msgsock):
看了一下服務(wù)器端的do-while循環(huán)體,每進行一次循環(huán),都關(guān)閉一次$msgsock然后再重新accept一次。
但是客戶端并沒有循環(huán)進行connect連接,只有循環(huán)的讀顯,甚至沒有循環(huán)寫。這就導(dǎo)致了只有在第一次連接的時候可以通信。服務(wù)器端程序進入第二個循環(huán)之后就會停留在accept那里(然后超時報錯)。

這一套一看就是某論壇上的例程啦(我也錯在這里過)。

如果只是驗證socket通信,而不是檢測連接可靠性,建議修改循環(huán),把accept和$msgsock的close部分都放在循環(huán)外,兩個程序的while循環(huán)里面都只進行讀和寫(和顯),就一個客戶端進行連接和通信,沒必要重復(fù)連接和斷開。

查看完整回答
反對 回復(fù) 2019-03-18
  • 3 回答
  • 0 關(guān)注
  • 1021 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號