π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[리λ μ€ λ€νΈμνΉ νλ‘κ·Έλλ°] BSD μμΌ λ³Έλ¬Έ
[리λ μ€ λ€νΈμνΉ νλ‘κ·Έλλ°] BSD μμΌ
μ§μ§μνμΉ΄ 2024. 1. 30. 19:06<μμμ§ λμ μ¬λ¬ΌμΈν°λ·μ μν 리λ μ€ νλ‘κ·Έλλ° with λΌμ¦λ² 리νμ΄ μμ μ μ°Έκ³ ν΄μ μμ±νμμ΅λλ€ :-)>
β μΈν°λ·κ³Ό BSD μ λμ€
1983λ UC λ²ν΄λ¦¬μμ μ¬μ©νλ BSD (Berkeley Software Distribution) μ TCP/IP λ€νΈμν¬μ ꡬνμ 맑겼λλ°, μ λμ€μ TCP/IP μ€ν (stack) μ΄ μΆκ°λμμΌλ©° ν΅μ μ μν΄ μμΌμ μΆκ°ν¨
BSD μμΌμ λ€νΈμν¬ νλ‘κ·Έλλ°μ νμ€ μΈν°νμ΄μ€λ‘, μ격 νΈμ€νΈλ₯Ό μ°κ²°μμΌ μ£Όλ 맀κ°μ²΄ μν μ μννλ€
λλΆλΆμ μ λμ€μ TCP/IP λ€νΈμν¬ μ€ν (stack) μ BSD κΈ°λ°μΌλ‘ νκ³ , μμΌ μμ€ν λ μ¬μ©νλ€
β BSD μμΌ
μμΌμ νλ‘μΈμ€ κ°μ μνΈ μλ°©ν₯ ν΅μ λ°©μ
μννΈμ¨μ΄λ‘ μμ±λ ν΅μ μ μμ μ λνμΊκ³ λ€νΈμν¬μμμ λ¨λ§λ€λΌλ¦¬μ μ°κ²°μ μν΄ μ¬μ©νλ€
λλ°μ΄μ€ νμΌκ³Ό λ§μ°¬κ°μ§λ‘ νμΌλ‘ λ€λ£° μ μλλ‘ νμΌ/μμΌ λμ€ν¬λ¦½ν°λ₯Ό μ 곡νλ©°, κ° μ’ λ¨μ μΌλ‘μ μ¬λ¬ μμ±λ€μ κ°μ§κ³ μλ€
μμΌμ νμΌ λμ€ν¬λ¦½ν°λ₯Ό μ΄μ©ν΄μ λμ νΈνμ±μ μ 곡νλλ°, νμΌλ‘ μ μ₯νλ κΈ°λ₯μ΄λ λ€νΈμν¬λ₯Ό μ΄μ©ν΄μ λ°μ΄ν°λ₯Ό 보λ΄λ κΈ°λ₯μ νλμ μ½λλ‘ ν¨κ» μ¬μ©ν μ μλ€
μμΌμ μ΄μ©νλ©΄ TCP/IP λ€νΈμν¬μ λν μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄μ ν΅μ μ μνν μ μλλ°, μμΌμ ν΅ν νλ‘μΈμ€μ ν΅μ μ ν΄λΌμ΄μΈνΈμ μλ² κ΅¬μ‘°μ κΈ°μ΄λ₯Ό λκ³ μλ€
ν¨μ | λ΄μ© | λΉκ³ |
socket() | λ€νΈμν¬ ν΅μ μ μν μμΌμ μμ± | |
socketpari() | μ°κ²°μ μν ν μμ μμΌμ μ§μ | IPC |
bind() | μλ²μμ μμΌμ μ΄λ¦μ λΆμ¬ | μλ² |
listen() | ν΄λΌμ΄μΈνΈμ μμΌλ€μ μν ν μμ± | |
accpet() | μλ²μμ ν΄λΌμ΄μΈνΈμ μ μμ λκΈ° | |
connect() | ν΄λΌμ΄μΈνΈμμ μλ²λ‘ μ μ | ν΄λΌμ΄μΈνΈ |
write() / send() | λ°μ΄ν°λ₯Ό μλλ°©μκ² μ μ‘ | TCP, sendmsg(), sendmmsg() |
sendto() | λ°μ΄ν°λ₯Ό UDP ν¨ν·μΌλ‘ μλλ°©μκ² μ μ‘ | UDP |
read() / recv() | λ°μ΄ν°λ₯Ό μλλ°©μΌλ‘λΆν° λ°λλ€ | TCP, recvmsg(), recvmmsg() |
recvfrom() | λ°μ΄ν°λ₯Ό UDP ν¨ν·μΌλ‘ μλλ°©μΌλ‘λΆν° λ°λλ€ | UDP |
close() | μμΌμ μ°κ²°μ μ’ λ£νλ€ | |
shutdown() | μ νμ μΌλ‘ μμΌμ μ°κ²°μ μ’ λ£νλ€ |
β μμΌμ ν΅ν IPC
νλ‘μΈμ€ κ° ν΅μ μλ μμΌμ μ¬μ©ν μ μλ€
socketpair() ν¨μλ μ£Όμλ₯Ό κ°μ§ μλ ν μμ μμΌμ μμ±νλλ°, μ΄ ν μμ μμΌμ μ΄μ©ν΄μ λΆλͺ¨ νλ‘μΈμ€μ μμ νλ‘μΈμ€ κ° ν΅μ μ μνν μ μλ€
int socketpair(int domain, int type, int protocol, inst sv[2]);
socketpair() ν¨μλ νμ΄νλ FIFO μ λ€λ₯΄κ² μλ°©ν₯ ν΅μ μ μ§μνλ©°, μ λμ€ λ΄λΆμ μΌλ‘ ν΅μ ν λ μ¬μ©λλ μ λμ€ λλ©μΈμμλ§ μ¬μ© κ°λ₯, κ΄κ³μλ νλ‘μΈμ€ κ°μ ν΅μ μ μ§μνμ§ μλλ€
// socketpair() ν¨μλ₯Ό μ΄μ©ν΄μ λ νλ‘μΈμ€ μ¬μ΄μ λ°μ΄ν°λ₯Ό κ΅ννλ€
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <wait.h>
#include <sys/socket.h>
int main(int argc, char **argv)
{
int ret, sock_fd[2];
int status;
char buf[ ] = "Hello World", line[BUFSIZ];
pid_t pid;
// socketpair() ν¨μλ 2κ°μ μμΌ λμ€ν¬λ¦½ν°λ₯Ό μ°λ€
// 2κ°μ int ν μμΌ λμ€ν¬λ¦½ν°λ₯Ό μν λ°°μ΄μ μμ±νλ€
// λ‘컬 λλ©μΈλ§ μ¬μ© νλ―λ‘ AF_LOCAL νΉμ AF_UNIX
// μ€νΈλ¦Ό ν΅μ μ μν SOCKET_STREAM
ret = socketpair(AF_LOCAL, SOCK_STREAM, 0, sock_fd); /* ν μμ μμΌμ μμ± */
if(ret == -1) {
perror("socketpair()");
return -1;
}
printf("sorket 1 : %d\n", sock_fd[0]); /* κ° μμΌμ λμ€ν¬λ¦½νΈ λ²νΈλ₯Ό μΆλ ₯ */
printf("sorket 2 : %d\n", sock_fd[1]);
if((pid = fork()) < 0) { /* fork( ) ν¨μ μ€ν μλ¬ μμ μ²λ¦¬ */
perror("fork()");
} else if(pid == 0) { /* μμ νλ‘μΈμ€μΌ λμ μ²λ¦¬ */
write(sock_fd[0], buf, strlen(buf) + 1); /* λΆλͺ¨ νλ‘μΈμ€λ‘ λ°μ΄ν° 보λ΄κΈ° */
printf("Data send : %s\n", buf);
close(sock_fd[0]); /* μμΌ λ«κΈ° */
} else { /* λΆλͺ¨ νλ‘μΈμ€μΌ λμ μ²λ¦¬ */
wait(&status); /* μμ νλ‘μΈμ€μ μ’
λ£ λκΈ° */
read(sock_fd[1], line, BUFSIZ); /* μμ νλ‘μΈμ€μμ μ¨ λ°μ΄ν° μ½κΈ° */
printf("Received data : %s\n", line);
close(sock_fd[1]); /* μμΌ λ«κΈ° */
}
return 0;
}
gcc -o socketpair socketpair.c
./socketpair