2025-02-10T05:29:29
This commit is contained in:
114
docs/20_socket.md
Normal file
114
docs/20_socket.md
Normal file
@@ -0,0 +1,114 @@
|
||||
# 소켓
|
||||
|
||||
- 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()를 통해서 서버 소켓에 연결합니다.
|
||||
Reference in New Issue
Block a user