😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[λ¦¬λˆ…μŠ€ λ„€νŠΈμ›Œν‚Ή ν”„λ‘œκ·Έλž˜λ°] BSD μ†ŒμΌ“ λ³Έλ¬Έ

πŸ‘©‍πŸ’» IoT (Embedded)/Raspberry Pi

[λ¦¬λˆ…μŠ€ λ„€νŠΈμ›Œν‚Ή ν”„λ‘œκ·Έλž˜λ°] BSD μ†ŒμΌ“

μ§•μ§•μ•ŒνŒŒμΉ΄ 2024. 1. 30. 19:06
728x90
λ°˜μ‘ν˜•

<μ„œμ˜μ§„ λ‹˜μ˜ 사물인터넷을 μœ„ν•œ λ¦¬λˆ…μŠ€ ν”„λ‘œκ·Έλž˜λ° 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

 

 

 

 

 

 

 

728x90
λ°˜μ‘ν˜•
Comments