펄 소켓 프로그래밍
호스트 사이에 또는 컴퓨터의 프로세스가 통신 할 수 있도록 또한 "소켓"라고도 소켓은 애플리케이션이 일반적으로, 네트워크 요청 또는 응답 네트워크 요구에 "소켓"에 의해 발행된다.
이 섹션에서는 우리가 어떻게 소켓 서비스를 사용하는 펄 언어를받은 모든입니다.
서버 만들기
소켓 서비스를 만들소켓 기능을 사용합니다.
포트를 바인드bind 함수를 사용합니다.
포트 기능을듣고들을 수 있습니다.
함수는 클라이언트 요청을 수신받아 사용한다.
클라이언트 만들기
소켓 서비스를 만들소켓 기능을 사용합니다.
연결 기능을 사용하면 서버 소켓에 연결합니다.
다음 표는 클라이언트와 서버 간의 통신 흐름을 예시한다 :
서버 소켓 기능
소켓 기능
다음 펄, 우리는 소켓을 생성하기 위해 소켓 () 함수를 사용하여, 구문은 다음과
socket( SOCKET, DOMAIN, TYPE, PROTOCOL );
분석 매개 변수 :
만든 프로토콜 설정 소켓 도메인을 지정합니다. 예를 들면 :
-
AF_INET
IPv4 네트워크 프로토콜을 나타낸다 -
AF_INET6
IPv6에 대한 -
AF_UNIX
(a 파일을 사용하여) 로컬 소켓을 나타낸다
-
TYPE 소켓 타입은 SOCK_STREAM이나 SOCK_DGRAM으로 연결 지향 또는 연결없는 될 수 있습니다
프로토콜(과 getprotobynumber ( 'TCP'))해야한다 [2].실제 전송 프로토콜을 지정합니다.
다음 소켓 함수 호출 : 그래서
use Socket # 定义了 PF_INET 和 SOCK_STREAM socket(SOCKET,PF_INET,SOCK_STREAM,(getprotobyname('tcp'))[2]);
바인드 () 함수
소켓에 주소를 할당) (바인딩을 사용하여
bind( SOCKET, ADDRESS );
소켓 기술자를 소켓. ADDRESS 소켓 주소 (TCP / IP)의 세 가지 요소를 포함한다 :
주소 패밀리 (시스템이 될 수 있습니다에 TCP / IP는 AF_INET이다)
포트 번호 (예 : 21 등)
네트워크 주소 (예를 10.12.12.168 등)
소켓 () 소켓을 만들고 사용 후, 단지 그들이 사용하고 주소를 할당하지 않는 프로토콜을 제공합니다. 다른 호스트 연결을 수락하기 전에, 먼저) (바인드를 호출 할 필요가 소켓에 주소를 할당합니다.
다음과 같이 간단한 예는 다음과 같습니다
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";
또는 실행에 실패한 바인드 주소에 죽는다.
포트를 설정으로 setsockopt () SO_REUSEADDR 옵션을 설정하여 바로 재사용 할 수있다.
pack_sockaddr_in () 함수는 바이너리 형식으로 주소를 변환합니다.
수신 () 함수
소켓과 주소를 바인딩 할 때, 듣고 () 함수는 가능한 연결 요청을 수신하기 시작합니다. 사용시 그러나, 이것은 신뢰성있는 데이터의 스트림을 보장 할 수있다 :
listen( SOCKET, QUEUESIZE );
소켓 : 소켓 기술자.
QUEUESIZE는 : 큐는 새로운 연결 차면; 접속 요구 큐 모니터 제거 받아들이) (접수되면 정수 연결 요청이 도착이있을 때, 그 수신 대기열을 입력 할 경우, 큐의 크기를 모니터링하는 결정 인 요청은 오류를 반환합니다.
연결이 허용되면, 성공, 오류 리턴 -1 0을 반환합니다.
동의 () 함수
수락 () 함수는 요청 소켓 연결을 수용한다. 네트워크 주소 압축 된 형태에 성공하면, 그렇지 않으면 FALSE를 반환합니다 :
accept( NEW_SOCKET, SOCKET );
소켓 : 소켓 기술자.
주소 : 주소는 소켓 주소 (TCP / IP)는 세 가지 요소를 포함한다 :
주소 패밀리 (시스템이 될 수 있습니다에 TCP / IP는 AF_INET이다)
포트 번호 (예 : 21 등)
네트워크 주소 (예를 10.12.12.168 등)
일반적으로 무한 루프에 적용되는 () 동의 :
while(1) { accept( NEW_SOCKET, SOCKT ); kokoko. }
상기 예는 클라이언트 요청을 실시간으로 모니터링 할 수있다.
클라이언트 기능
연결 () 함수
소켓 연결 매개 변수 파일 기술자와 호스트 주소를 설정 () 시스템 호출을 연결합니다.
connect( SOCKET, ADDRESS );
다음은 서버 인스턴스 소켓 연결을 생성한다 :
$port = 21; # ftp 端口 $server_ip_address = "10.12.12.168"; connect( SOCKET, pack_sockaddr_in($port, inet_aton($server_ip_address))) or die "无法绑定端口! \n";
전체 예제
다음으로 우리는 완전한 예제를 통해 모든 소켓 응용 프로그램 기능을 이해하게 :
서버 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)) { # send them a message, close connection my $name = gethostbyaddr($client_addr, AF_INET ); print NEW_SOCKET "我是来自服务端的信息"; print "Connection recieved from $name\n"; close NEW_SOCKET; }
터미널을 열고, 다음 코드를 실행합니다 :
$ 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 = <SOCKET>) { print "$line\n"; } close SOCKET or die "close: $!";
다른 터미널을 열고, 다음 코드를 실행합니다 :
$ perl client.pl 我是来自服务端的信息