Socket 程式設計簡介

2022-06-26 08:09:17 字數 3713 閱讀 8830

本章節我們為大家接收 perl 語言中如何使用 socket 服務。

下圖演示了客戶端與服務端之間的通訊流程:

1、socket 函式

我們用 socket()函式來建立套接字,語法格式如下:

socket( socket, domain, type, protocol );
引數解析:

type套接字型別可以根據是面向連線的還是非連線分為sock_stream或sock_dgram

protocol應該是(getprotobyname('tcp'))[2]。指定實際使用的傳輸協議。

所以 socket 函式呼叫方式如下:

use socket     # 定義了 pf_inet 和 sock_stream

socket(socket,pf_inet,sock_stream,(getprotobyname(

'tcp

'))[2]);

socket 乙個socket的描述符。address 是 socket 位址 ( tcp/ip ) 包含了三個元素:

使用socket()建立套接字後,只賦予其所使用的協議,並未分配位址。在接受其它主機的連線前,必須先呼叫bind()為套接字分配乙個位址。

簡單例項如下:

use socket        # 定義了 pf_inet 和 sock_stream

$port = 12345

; # 監聽的埠

$server_ip_address = "

10.12.12.168";

bind( socket, pack_sockaddr_in($port, inet_aton($server_ip_address)))

or die

"無法繫結埠! \n

";

or die在繫結位址失敗後執行。

通過設定 setsockopt() 可選項 so_reuseaddr 設定埠可立即重複使用。

pack_sockaddr_in()函式將位址轉換為二進位制格式。

listen( socket, queuesize );
socket : 乙個socket的描述符。

queuesize : 是 乙個決定監聽佇列大小的整數,當有乙個連線請求到來,就會進入此監聽佇列;當乙個連線請求被accept()接受,則從監聽佇列中移出;當佇列滿後,新的連線請求會返回錯誤。

一旦連線被接受,返回0表示成功,錯誤返回-1。

accept( new_socket, socket );
new_socket : 乙個socket的描述符。

socket : 乙個socket的描述符。

accept() 通常應用在無限迴圈當中:

while(1

)

以上例項可以實時監聽客戶端的請求。

connect()系統呼叫為乙個套接字設定連線,引數有檔案描述符和主機位址。

connect( socket, address );
以下建立乙個連線到服務端 socket 的例項:

$port = 21

; # ftp 埠

$server_ip_address = "

10.12.12.168";

connect( socket, pack_sockaddr_in($port, inet_aton($server_ip_address)))

or die

"無法繫結埠! \n

";

接下來我們通過乙個完整例項來了解下所有 socket 函式的應用:

服務端 server.pl **:

#!/usr/bin/perl -w

# filename : server.pl

use strict;

use socket;

# 使用埠

7890

作為預設值

my $port = shift || 7890

;my $proto = getprotobyname('

tcp'

);my $server = "

localhost

"; # 設定本地位址

# 建立 socket, 埠可重複使用,建立多個連線

socket(socket, pf_inet, sock_stream, $proto)

or die

"無法開啟 socket $!\n";

setsockopt(socket, sol_socket, so_reuseaddr, 1)

or die

"無法設定 so_reuseaddr $!\n";

# 繫結埠並監聽

bind( socket, pack_sockaddr_in($port, inet_aton($server)))

or die

"無法繫結埠 $port! \n";

listen(socket,

5) or die "

listen: $!";

print

"訪問啟動:$port\n";

# 接收請求

my $client_addr;

while ($client_addr =accept(new_socket, socket))

view code

開啟乙個終端,執行以下**:

$ perl sever.pl

訪問啟動:

7890

客戶端 client.pl **:

#!/usr/bin/perl -w

# filename : client.pl

use strict;

use socket;

# 初始化位址與埠

my $host = shift || '

localhost';

my $port = shift || 7890

;my $server = "

localhost

"; # 主機位址

# 建立 socket 並連線

socket(socket,pf_inet,sock_stream,(getprotobyname(

'tcp

'))[2

]) or die

"無法建立 socket $!\n";

connect( socket, pack_sockaddr_in($port, inet_aton($server)))

or die

"無法連線:port $port! \n";

my $line;

while ($line = )

close socket or die

"close: $!

";

view code

開啟另外乙個終端,執行以下**:

$ perl client.pl

我是來自服務端的資訊

over。。。

參考:1、菜鳥教程

Socket 程式設計簡介

linux 公報 讓linux更富魅力!譯者 小牟 大多數的網路應用程式可以分成兩部分 客戶端和伺服器端。建立乙個socket include include當建立乙個socket時需要指定三個主要的引數 int socket int domain,int type,int protocol 域引數...

Socket 程式設計簡介

linux 公報 讓linux更富魅力!譯者 小牟 大多數的網路應用程式可以分成兩部分 客戶端和伺服器端。建立乙個socket include include當建立乙個socket時需要指定三個主要的引數 int socket int domain,int type,int protocol 域引數...

socket程式設計 01 socket簡介

在計算機通訊領域,socket 被翻譯為 套接字 它是計算機之間進行通訊的一種約定或一種方式。通過 socket 這種約定,一台計算機可以接收其他計算機的資料,也可以向其他計算機傳送資料。學習 socket,也就是學習計算機之間如何通訊,並編寫出實用的程式。計算機分布在世界各地,要想和它們通訊,必須...