『壹』 TCP 和 UDP 在socket編程中的區別
UDP和TCP編程步驟也有些不同,如下:
TCP編程的伺服器端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt(); * 可選
3、綁定IP地址、埠等信息到socket上,用函數bind();
4、開啟監聽,用函數listen();
5、接收客戶端上來的連接,用函數accept();
6、收發數據,用函數send()和recv(),或者read()和write();
7、關閉網路連接;
8、關閉監聽;
TCP編程的客戶端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、埠等信息到socket上,用函數bind();* 可選
4、設置要連接的對方的IP地址和埠等屬性;
5、連接伺服器,用函數connect();
6、收發數據,用函數send()和recv(),或者read()和write();
7、關閉網路連接;
與之對應的UDP編程步驟要簡單許多,分別如下:
UDP編程的伺服器端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、埠等信息到socket上,用函數bind();
4、循環接收數據,用函數recvfrom();
5、關閉網路連接;
UDP編程的客戶端一般步驟是:
1、創建一個socket,用函數socket();
2、設置socket屬性,用函數setsockopt();* 可選
3、綁定IP地址、埠等信息到socket上,用函數bind();* 可選
4、設置對方的IP地址和埠等屬性;
5、發送數據,用函數sendto();
6、關閉網路連接;
『貳』 怎樣使用php實現tcp/udp通訊
1.在socket_bind的時候ip地址不能真回環地址如127.0.0.1
2.server.php後台跑起來的時候nohup php server.php > /var/tmp/a.log 2>&1 &
一: udp 方式
1) server.php
<?php //error_reporting( E_ALL ); set_time_limit( 0 ); ob_implicit_flush(); $socket = socket_create( AF_INET, SOCK_DGRAM, SOL_UDP ); if ( $socket === false ) { echo "socket_create() failed:reason:" . socket_strerror( socket_last_error() ) . "\n"; } $ok = socket_bind( $socket, '202.85.218.133', 11109 ); if ( $ok === false ) { echo "socket_bind() failed:reason:" . socket_strerror( socket_last_error( $socket ) ); } while ( true ) { $from = ""; $port = 0; socket_recvfrom( $socket, $buf,1024, 0, $from, $port ); echo $buf; usleep( 1000 ); } ?>
2) client.php
<?php $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); $msg = 'hello'; $len = strlen($msg); socket_sendto($sock, $msg, $len, 0, '202.85.218.133', 11109); socket_close($sock); ?>
二: TCP 方式
1)server.php
<?php //error_reporting( E_ALL ); set_time_limit( 0 ); ob_implicit_flush(); $socket = socket_create( AF_INET, SOCK_STREAM, SOL_TCP ); socket_bind( $socket, '192.168.2.143', 11109 ); socket_listen($socket); $acpt=socket_accept($socket); echo "Acpt!\n"; while ( $acpt ) { $words=fgets(STDIN); socket_write($acpt,$words); $hear=socket_read($acpt,1024); echo $hear; if("bye\r\n"==$hear){ socket_shutdown($acpt); break; } usleep( 1000 ); } socket_close($socket) ?>
2) client.php
<?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); $con=socket_connect($socket,'192.168.2.143',11109); if(!$con){socket_close($socket);exit;} echo "Link\n"; while($con){ $hear=socket_read($socket,1024); echo $hear; $words=fgets(STDIN); socket_write($socket,$words); if($words=="bye\r\n"){break;} } socket_shutdown($socket); socket_close($sock); ?>
『叄』 PHP編程語言中的socket是什麼東西
HP使用Berkley的socket庫來創建它的連接。你可以知道socket只不過是一個數據結構。你使用這個socket數據結構去開始一個客戶端和伺服器之間的會話。這個伺服器是一直在監聽准備產生一個新的會話。當一個客戶端連接伺服器,它就打開伺服器正在進行監聽的一個埠進行會話。這時,伺服器端接受客戶端的連接請求,那麼就進行一次循環。現在這個客戶端就能夠發送信息到伺服器,伺服器也能發送信息給客戶端。產生一個Socket,你需要三個變數:一個協議、一個socket類型和一個公共協議類型。產生一個socket有三種協議供選擇,繼續看下面的內容來獲取詳細的協議內容。定義一個公共的協議類型是進行連接一個必不可少的元素。下面的表我們看看有那些公共的協議類型。表一:協議名字/常量描述AF_INET這是大多數用來產生socket的協議,使用TCP或UDP來傳輸,用在IPv4的地址AF_INET6與上面類似,不過是來用在IPv6的地址AF_UNIX本地協議,使用在Unix和Linux系統上,它很少使用,一般都是當客戶端和伺服器在同一台及其上的時候使用表二:Socket類型名字/常量描述SOCK_STREAM這個協議是按照順序的、可靠的、數據完整的基於位元組流的連接。這是一個使用最多的socket類型,這個socket是使用TCP來進行傳輸。SOCK_DGRAM這個協議是無連接的、固定長度的傳輸調用。該協議是不可靠的,使用UDP來進行它的連接。SOCK_SEQPACKET這個協議是雙線路的、可靠的連接,發送固定長度的數據包進行傳輸。必須把這個包完整的接受才能進行讀取。SOCK_RAW這個socket類型提供單一的網路訪問,這個socket類型使用ICMP公共協議。(ping、traceroute使用該協議)SOCK_RDM這個類型是很少使用的,在大部分的操作系統上沒有實現,它是提供給數據鏈路層使用,不保證數據包的順序表三:公共協議名字/常量描述ICMP互聯網控制消息協議,主要使用在網關和主機上,用來檢查網路狀況和報告錯誤信息UDP用戶數據報文協議,它是一個無連接,不可靠的傳輸協議TCP傳輸控制協議,這是一個使用最多的可靠的公共協議,它能保證數據包能夠到達接受者那兒,如果在傳輸過程中發生錯誤,那麼它將重新發送出錯數據包。現在你知道了產生一個socket的三個元素,那麼我們就在php中使用socket_create()函數來產生一個socket。這個socket_create()函數需要三個參數:一個協議、一個socket類型、一個公共協議。socket_create()函數運行成功返回一個包含socket的資源類型,如果沒有成功則返回false。Resourecesocket_create(intprotocol,intsocketType,intcommonProtocol);現在你產生一個socket,然後呢?php提供了幾個操縱socket的函數。你能夠綁定socket到一個IP,監聽一個socket的通信,接受一個socket;現在我們來看一個例子,了解函數是如何產生、接受和監聽一個socket。上面這個例子產生一個你自己的伺服器端。例子第一行,$commonProtocol=getprotobyname(「tcp」);使用公共協議名字來獲取一個協議類型。在這里使用的是TCP公共協議,如果你想使用UDP或者ICMP協議,那麼你應該把getprotobyname()函數的參數改為「udp」或「icmp」。還有一個可選的法是不使用getprotobyname()函數而是指定SOL_TCP或SOL_UDP在socket_create()函數中。$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);例子的第二行是產生一個socket並且返回一個socket資源的實例。在你有了一個socket資源的實例以後,你就必須把socket綁定到一個IP地址和某一個埠上。socket_bind($socket,『localhost』,1337);在這里你綁定socket到本地計算機(127.0.0.1)和綁定socket到你的1337埠。然後你就需要監聽所有進來的socket連接。socket_listen($socket);在第四行以後,你就需要了解所有的socket函數和他們的使用。表四:Socket函數函數名描述socket_accept()接受一個Socket連接socket_bind()把socket綁定在一個IP地址和埠上socket_clear_error()清除socket的錯誤或者最後的錯誤代碼socket_close()關閉一個socket資源socket_connect()開始一個socket連接socket_create_listen()在指定埠打開一個socket監聽socket_create_pair()產生一對沒有區別的socket到一個數組里socket_create()產生一個socket,相當於產生一個socket的數據結構socket_get_option()獲取socket選項socket_getpeername()獲取遠程類似主機的ip地址socket_getsockname()獲取本地socket的ip地址socket_iovec_add()添加一個新的向量到一個分散/聚合的數組socket_iovec_alloc()這個函數創建一個能夠發送接收讀寫的iovec數據結構socket_iovec_delete()刪除一個已經分配的iovecsocket_iovec_fetch()返回指定的iovec資源的數據socket_iovec_free()釋放一個iovec資源socket_iovec_set()設置iovec的數據新值socket_last_error()獲取當前socket的最後錯誤代碼socket_listen()監聽由指定socket的所有連接socket_read()讀取指定長度的數據socket_readv()讀取從分散/聚合數組過來的數據socket_recv()從socket里結束數據到緩存socket_recvfrom()接受數據從指定的socket,如果沒有指定則默認當前socketsocket_recvmsg()從iovec里接受消息socket_select()多路選擇socket_send()這個函數發送數據到已連接的socketsocket_sendmsg()發送消息到socketsocket_sendto()發送消息到指定地址的socketsocket_set_block()在socket里設置為塊模式socket_set_nonblock()socket里設置為非塊模式socket_set_option()設置socket選項socket_shutdown()這個函數允許你關閉讀、寫、或者指定的socketsocket_strerror()返回指定錯誤號的詳細錯誤socket_write()寫數據到socket緩存socket_writev()寫數據到分散/聚合數組(注:函數介紹刪減了部分原文內容,函數詳細使用建議參考英文原文,或者參考PHP手冊)以上所有的函數都是PHP中關於socket的,使用這些函數,你必須把你的socket打開,如果你沒有打開,請編輯你的php.ini文件,去掉下面這行前面的注釋:extension=php_sockets.dll如果你無法去掉注釋,那麼請使用下面的代碼來載入擴展庫:如果你不知道你的socket是否打開,那麼你可以使用phpinfo()函數來確定socket是否打開。你通過查看phpinfo信息了解socket是否打開。如下圖:查看phpinfo()關於socket的信息◆產生一個伺服器現在我們把第一個例子進行完善。你需要監聽一個指定的socket並且處理用戶的連接。你應該使用你的命令提示符來運行這個例子。理由是因為這里將產生一個伺服器,而不是一個Web頁面。如果你嘗試使用Web瀏覽器來運行這個腳本,那麼很有可能它會超過30秒的限時。你可以使用下面的代碼來設置一個無限的運行時間,但是還是建議使用命令提示符來運行。set_time_limit(0);在你的命令提示符中對這個腳本進行簡單測試:Php.exeexample01_server.php如果你沒有在系統的環境變數中設置php解釋器的路徑,那麼你將需要給php.exe指定詳細的路徑。當你運行這個伺服器端的時候,你能夠通過遠程登陸(telnet)的方式連接到埠1337來測試這個伺服器。如下圖:上面的伺服器端有三個問題:1.它不能接受多個連接。2.它只完成唯一的一個命令。3.你不能通過Web瀏覽器連接這個伺服器。這個第一個問題比較容易解決,你可以使用一個應用程序去每次都連接到伺服器。但是後面的問題是你需要使用一個Web頁面去連接這個伺服器,這個比較困難。你可以讓你的伺服器接受連接,然後些數據到客戶端(如果它一定要寫的話),關閉連接並且等待下一個連接。在上一個代碼的基礎上再改進,產生下面的代碼來做你的新伺服器端:這個伺服器端要做什麼呢?它初始化一個socket並且打開一個緩存收發數據。它等待連接,一旦產生一個連接,它將列印「Socketconnected」在伺服器端的屏幕上。這個伺服器檢查緩沖區,如果緩沖區里有數據,它將把數據發送到連接過來的計算機。然後它發送這個數據的接受信息,一旦它接受了信息,就把信息保存到數據里,並且讓連接的計算機知道這些信息,最後關閉連接。當連接關閉後,伺服器又開始處理下一次連接。(翻譯的爛,附上原文)Thisiswhattheserverdoes..Thenitwaitsforaconnection.「Socketconnected」.;ifthereis,..,,andthenclosestheconnection.Aftertheconnectionisclosed,.◆產生一個客戶端處理第二個問題是很容易的。你需要產生一個php頁連接一個socket,發送一些數據進它的緩存並處理它。然後你又個處理後的數據在還頓,你能夠發送你的數據到伺服器。在另外一台客戶端連接,它將處理那些數據。.,,andprocessit..Whenanotherclientconnects,.下面的例子示範了使用socket:這個例子的代碼演示了客戶端連接到伺服器。客戶端讀取數據。如果這是第一時間到達這個循環的首次連接,這個伺服器將發送「NODATA」返回給客戶端。如果情況發生了,這個客戶端在連接之上。客戶端發送它的數據到伺服器,數據發送給伺服器,客戶端等待響應。一旦接受到響應,那麼它將把響應寫到屏幕上。
『肆』 php的socket編程
socket_bind($socket,'127.0.0.1',9000);
伺服器端綁定IP指的是127.0.0.1,就是伺服器本機,監聽9000埠
『伍』 socket 編程和PHP區別
這幾個其實沒什麼太大關系,我一層一層給你講吧
從網路開始:
網路從上到下:應用層、傳輸層、網路層、鏈路層、物理層
一般我們正常接觸的能上網的軟體,都是屬於應用層的,這一層負責給用戶用的
那傳輸層是什麼呢,就是TCP、UDP這些,這一層負責把用戶數據傳送到網路層上,或從網路層接收
再然後就是網路層,比如IP協議就是屬於網路層的,網路層就是負責把數據包提交到真正的網路上,或者說是提交給鏈路層,然後鏈路層再提交給物理層,說白了這個時候數據就會在光纖上面傳了。接收的過程和以上剛好就相反嘍。
現在可以說socket了,這個詞翻譯過來就是套接字,其實我也不知道為什麼這么翻譯,我感覺是因為這個東西是一個「套」,套著一些東西,然後計算機裡面一般以「字」為單位,一個字是兩個位元組,也就是16位。當然也不是說套接字就是16位,我就是想說明這個套接字是一個類似於「單位」一樣的東西。
這個「接」最好理解,因為套接字能幫助你連接網路。
套接字編程其實也就是網路編程了,因為網路協議實在是太復雜了,如果從頭開始寫,估計花上一年時間才能勉強寫一個消息包發送出去。所以呢,前人就給你寫好了很多東西,這些東西封裝起來,就成為了今天的套接字。
通過套接字的這些API呢,也就是函數介面,你就能很簡單地連接應用層,傳輸層還有網路層,也就是說,你只需要調用幾個函數,把想發送的數據通過這幾個函數封裝成數據包,套接字就能把這些數據包提交給操作系統,操作系統呢,就會把這些數據包送到網卡上,然後就發送出去。
最後就是PHP了,PHP和以上就沒太大關系了,PHP是一種腳本語言,什麼腳本語言呢?其實就是一種解釋性的語言,這個解釋性的語言又是什麼呢,其實就是一些標記語言,通過標記來解釋語義,當然也有邏輯的,不過腳本語言是沒有C語言等這些編譯語言強大的。
PHP還是伺服器端語言,用於編寫伺服器的,伺服器你可以暫時理解成網站的後台程序。
嗯,就是這樣了,雖然只有10分,但還是忍不住給你答了這么多,原創的哦!
『陸』 6.Twisted UDP Socket 編程示例
示例:客戶端每隔10秒向服務端報送設備使用情況,具體數據如下:
數據以文本進行傳輸,傳輸格式:Key:Value,中間用冒號分隔。服務端只做數據的原樣顯示並回復"OK!"
由於 UDP 沒有連接的概念,所以大多數情況下,採用 UDP Socket 實現的應用都是由設備採集數據上報到服務上來運行的。
雖然對於 UDP 來說沒有服務端和客戶端的概念,但在實際項目開發中,我們一般還是要區分服務端和客戶端的。對於 UDP 服務端來說,其實代碼很簡單,因為其主要任務就是接收數據,然後對數據進行處理。
先來編寫代碼框架:
代碼中,主要實現的是 datagramReceived 事件,一般在該事件的代碼中就是我們的業務邏輯,示例代碼如下:
客戶端代碼相對比服務端要復雜一點,主要是客戶端需要執行定時任務,這樣的話,我們需要設計一個線程來執行該定時任務,由於線程中需要發送數據到服務端,所以,在線程中需要設計一個屬性指向客戶端的 Protocol。線程的框架代碼如下:
客戶端框架代碼:
線程主要通過 Protocol 發送數據,實現代碼如下:
客戶端 Protocol 代碼實現如下:
在 Protocol 啟動時連接到伺服器,這樣就可以形成 Connected UDP,相對於 UDP 來說,數據的傳輸可靠性有所提高,同時,在代碼中發送數據也不需要寫服務端的地址。
服務端:
客戶端:
『柒』 Python 之 Socket編程(TCP/UDP)
socket(family,type[,protocal]) 使用給定的地址族、套接字類型、協議編號(默認為0)來創建套接字。
有效的埠號: 0~ 65535
但是小於1024的埠號基本上都預留給了操作系統
POSIX兼容系統(如Linux、Mac OS X等),在/etc/services文件中找到這些預留埠與的列表
面向連接的通信提供序列化、可靠的和不重復的數據交付,而沒有記錄邊界。意味著每條消息都可以拆分多個片段,並且每個消息片段都能到達目的地,然後將它們按順序組合在一起,最後將完整的信息傳遞給等待的應用程序。
實現方式(TCP):
傳輸控制協議(TCP), 創建TCP必須使用SOCK_STREAM作為套接字類型
因為這些套接字(AF_INET)的網路版本使用網際網路協議(IP)來搜尋網路中的IP,
所以整個系統通常結合這兩種協議(TCP/IP)來進行網路間數據通信。
數據報類型的套接字, 即在通信開始之前並不需要建議連接,當然也無法保證它的順序性、可靠性或重復性
實現方式(UDP)
用戶數據包協議(UDP), 創建UDP必須使用SOCK_DGRAM (datagram)作為套接字類型
它也使用網際網路來尋找網路中主機,所以是UDP和IP的組合名字UDP/IP
注意點:
1)TCP發送數據時,已建立好TCP連接,所以不需要指定地址。UDP是面向無連接的,每次發送要指定是發給誰。
2)服務端與客戶端不能直接發送列表,元組,字典。需要字元串化repr(data)。
TCP的優點: 可靠,穩定 TCP的可靠體現在TCP在傳遞數據之前,會有三次握手來建立連接,而且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完後,還會斷開連接用來節約系統資源。
TCP的缺點: 慢,效率低,佔用系統資源高,易被攻擊 TCP在傳遞數據之前,要先建連接,這會消耗時間,而且在數據傳遞時,確認機制、重傳機制、擁塞控制機制等都會消耗大量的時間,而且要在每台設備上維護所有的傳輸連接,事實上,每個連接都會佔用系統的CPU、內存等硬體資源。 而且,因為TCP有確認機制、三次握手機制,這些也導致TCP容易被人利用,實現DOS、DDOS、CC等攻擊。
什麼時候應該使用TCP : 當對網路通訊質量有要求的時候,比如:整個數據要准確無誤的傳遞給對方,這往往用於一些要求可靠的應用,比如HTTP、HTTPS、FTP等傳輸文件的協議,POP、SMTP等郵件傳輸的協議。 在日常生活中,常見使用TCP協議的應用如下: 瀏覽器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件傳輸.
UDP的優點: 快,比TCP稍安全 UDP沒有TCP的握手、確認、窗口、重傳、擁塞控制等機制,UDP是一個無狀態的傳輸協議,所以它在傳遞數據時非常快。沒有TCP的這些機制,UDP較TCP被攻擊者利用的漏洞就要少一些。但UDP也是無法避免攻擊的,比如:UDP Flood攻擊……
UDP的缺點: 不可靠,不穩定 因為UDP沒有TCP那些可靠的機制,在數據傳遞時,如果網路質量不好,就會很容易丟包。
什麼時候應該使用UDP: 當對網路通訊質量要求不高的時候,要求網路通訊速度能盡量的快,這時就可以使用UDP。 比如,日常生活中,常見使用UDP協議的應用如下: QQ語音 QQ視頻 TFTP ……