# 소켓 - socket(소켓, 도메인, 타입, 프로토콜) - 도메인: `PF_INET`으로 지정합니다. - 타입: TCP/IP 연결을 사용하기 위해서는 `SOCK_STREAM`으로 지정합니다. - 프로토콜: `getprotobyname('tcp')` - bind(소켓, 어드레스) ```perl bind($socket, pack_sockaddr_in(9999, inet_aton('123.456.789.1'))); ``` - listen(소켓, 큐사이즈) - 큐사이즈: 동시 연결 가능한 최대 숫자를 지정합니다. - accept(클라이언트소켓, 서버소켓) 일반적으로, 무한 루프 안에서 사용됩니다. ```perl 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 ```perl #!/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 ```perl #!/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()를 통해서 서버 소켓에 연결합니다.