Files
perl-examples/docs/20_socket.md
2025-02-10 05:29:29 +09:00

2.3 KiB

소켓

  • socket(소켓, 도메인, 타입, 프로토콜)

    • 도메인: PF_INET으로 지정합니다.

    • 타입: TCP/IP 연결을 사용하기 위해서는 SOCK_STREAM으로 지정합니다.

    • 프로토콜: getprotobyname('tcp')

  • bind(소켓, 어드레스)

    bind($socket, pack_sockaddr_in(9999, inet_aton('123.456.789.1')));
    
  • listen(소켓, 큐사이즈)

    • 큐사이즈: 동시 연결 가능한 최대 숫자를 지정합니다.
  • accept(클라이언트소켓, 서버소켓) 일반적으로, 무한 루프 안에서 사용됩니다.

    while (1){
        accept($client_socket, $server_socket);
    }
    
  • connect(소켓, 주소)

  • recv

  • send

  • shutdown, close

  • inet_aton

    문자열 형식의 주소를 pack_sockaddr_in()에 전달하기 위한 바이너리 형식으로 변환합니다.

  • inet_ntoa

  • inet_pton

    첫 번째 매개변수는 AF_INET 또는 AF_INET6입니다.

  • inet_ntop

Server

#!/usr/bin/perl
use warnings;
use strict;
use Socket;

my $port = 9999;

# 
my $server;
socket($server, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
bind($server, sockaddr_in($port, INADDR_ANY)) or die $!;
listen($server, 10);
while(1) {
    my $client;
    my $paddr = accept($client, $server);
    my($port, $iaddr) = sockaddr_in($paddr);
    my $name = gethostbyaddr($iaddr, AF_INET);
    print $client "Smile from the server";
    print "Connection recieved from $name\n";
    close $client;
}
# https://perldoc.perl.org/perlipc#Sockets%3A-Client%2FServer-Communication
  • socket()으로 소켓을 만듭니다.

  • bind()는 소켓과 포트 번호를 연결합니다.

  • listen()을 실행해서 해당 포트에 대해 수신 대기 상태로 만듭니다.

  • accept()를 사용해서 클라이언트와 연결합니다.

Client

#!/usr/bin/perl
use warnings;
use strict;
use Socket;

my $port = 9999;
my $host = "localhost";

my $socket;
my $iaddr = inet_aton($host);
my $paddr = sockaddr_in($port, $iaddr);

socket($socket, PF_INET, SOCK_STREAM, getprotobyname('tcp'));
connect($socket, $paddr) or die $!;

my $line;
while ($line = <$socket>) {
   print "$line\n";
}
close $socket or die "close: $!";
exit (0);
  • socket()으로 소켓을 만듭니다.

  • connect()를 통해서 서버 소켓에 연결합니다.