php socket 用户名密码,PHP用socket模拟post之fsocketopen
地聽說這個功能需求的時候,立即就蒙了,不騙大家!首先PHP的socket幾乎都沒使用過,其次沒有聽說過post還能用PHP的socket來模擬的呢!后來找了個案例看了看,才明白其實沒有那么高深,只不過戰地還不清楚post的原理和本質而已,其實本質就是發送給目的程序一個標志為post的協議串如下:
POST /目的程序 HTTP/1.1
Accept: */*
Accept-Language: zh-cn,en-us;q=0.5
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; .NET CLR
1.0.3705; .NET CLR 1.1.4322)
Host: 要發送到的主機地址
Content-Length: 發送數據的長度
Pragma: no-cache
Cache-Control: no-cache
username=php&password=iask?//post發送的數據
我想大家對form的post方法應該是最熟悉不過了,例如我們想吧用戶名和密碼發送給某個頁面的時候,點擊有兩個文本域的表單的提交按鈕,這個表單發送到action程序的就是以上數據。知道了這一點我想就不難了。
這時候我們只需要用php的socket打開一個端口,例如80端口,把以上信息利用這個端口發送給目的程序就行了。
我們如何在一個端口上建立一個socket信道呢?
在PHP中是如此簡單呢!
fsocketopen(主機名稱,端口號碼,錯誤號的接受變量,錯誤提示的接受變量,超時時間)
主機名稱就是你需要發送數據的目的地;
端口號就是這個目的程序會在哪個端口等著你的數據;
錯誤號的接受變量,這個是如果建立socket不成功的時候返回的錯誤編號;
錯誤提示的變量,是錯誤的時候返回的錯誤提示信息;
超時時間,就是post數據之后如果對方沒有回應信息,等待的最長時間。
如果不出意外(你正確的設置fsocketopen()函數的參數)的話,一個socket信道現在已經打開了,我們下一步需要做的就是,通過這個打開的信道把post請求協議發給目的程序,這時候可以使用fwrite或者fputs函數中的任意一個,把post的請求格式發給fsocketopen()打開的句柄,這時候一個偉大的socket模擬的post請求就誕生了。順便說一下啊:
你發送的時候可不能把我的post請求格式直接ctrl + V過去,你沒看見里面的漢字等你自己去填寫的嗎?
以上是文字的描述,如果大家覺得說的非常垃圾,非常沒有說服力的話,下邊有一個現成的程序片段,大家可以看看。
$port = $url['port'] ? $url['port'] :
80;?$fp = fsockopen($url['host'], $port, $errno,
$errstr,10);?if (!$fp) return "在主機: $url[host] $port 打開socket失敗,失敗原因是: $errno -
$errstr";?fputs($fp, sprintf("POST %s%s%s HTTP/1.0rn", $url['path'],
$url['query'] ? "?" : "", $url['query']));?fputs($fp, "Host:".$url['host']."rn");?fputs($fp, "Content-type:
application/x-www-form-urlencodedrn");?fputs($fp, "Content-length: " . strlen($encoded) .
"rn");?fputs($fp, "Connection: closernrn");?fputs($fp, "$encoded ");
對了還是順便說一下吧,fgets($fp,1024);這個可以得到返回值的哦!!已經有不止一個人問過我咋接受返回了!!
總結
以上是生活随笔為你收集整理的php socket 用户名密码,PHP用socket模拟post之fsocketopen的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php文件运行的域名怎么改,discuz
- 下一篇: nginx php默认首页,iis、ap