λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

TIL (Today I Learned)/Network

[TCP/IP] socketpair ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ μ†ŒμΌ“ ν”„λ‘œκ·Έλž¨μ˜ κ΅¬ν˜„ - ν”„λ‘œμ„ΈμŠ€ ν•˜λ‚˜

728x90

socketpair ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ μ†ŒμΌ“ ν”„λ‘œκ·Έλž¨μ˜ κ΅¬ν˜„ - ν”„λ‘œμ„ΈμŠ€ ν•˜λ‚˜

μ„œλ‘œ 톡신할 λ•Œλ©΄ 두 개의 μ†ŒμΌ“μ„ μƒμ„±ν•΄μ„œ 자료λ₯Ό μ†‘μˆ˜μ‹ ν•œλ‹€. μ΄λ•Œ 두 개의 μ†ŒμΌ“μ„ μƒμ„±ν•˜λŠ” κ°€μž₯ κ°„λ‹¨ν•œ 방법이 socketpair ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀.
κ°œλ°œμžκ°€ 두 μ†ŒμΌ“ 간에 λ³„λ„μ˜ μ—°κ²° 과정을 μ²˜λ¦¬ν•˜μ§€ μ•Šμ•„λ„ 두 개의 μ†ŒμΌ“μ„ μƒμ„±ν•˜κ³  μžλ™μœΌλ‘œ μ—°κ²°κΉŒμ§€ ν•΄μ€€λ‹€.
κ°œλ°œμžλŠ” read와 write ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ„œ μ†ŒμΌ“μ„ 톡해 자료λ₯Ό μ†‘μˆ˜μ‹ ν•˜λ©΄ λœλ‹€.

ν•¨μˆ˜

#include <sys/types.h>
#include <sys/socket.h>

int socketpair(int domain, int type, int protocol, int sd[2]);

λ°˜ν™˜κ°’

  • 성곡 μ‹œ : 0
  • μ‹€νŒ¨ μ‹œ : -1

인자

  • domain : μ‚¬μš©ν•  ν”„λ‘œν† μ½œ νŒ¨λ°€λ¦¬
  • type : ν•΄λ‹Ή ν”„λ‘œν† μ½œμ—μ„œ μ‚¬μš©ν•  μ†ŒμΌ“ μœ ν˜•
  • protocol : IPPROTO_TCP, IPPROTO_UDP, 0 λ“±μ˜ ν”„λ‘œν† μ½œ
  • sd[2] : sd[0], sd[1]
#include<stdio.h>
#include<string.h>
#include <sys/socket.h>

int main(){
        int sd[2], result;                              // 2개의 μ†ŒμΌ“ 생성 sd[0] sd[1]
        int n1, n2;
        char buf[BUFSIZ];
        char data[] = "This is from sd[0]";

        result = socketpair(PF_LOCAL, SOCK_STREAM, 0, sd);

        n1 = write(sd[0], data, strlen(data));
        printf("[send] %s\n", data);

        n2 = read(sd[1], buf, BUFSIZ);
        buf[n2] = '\0';
        printf("[received] %s\n", buf);

        close(sd[0]);
        close(sd[1]);
}

κ²°κ³Όν™”λ©΄

image

image

socketpair ν•¨μˆ˜λ‘œ μ†ŒμΌ“ sd[0]κ³Ό sd[1]을 μƒμ„±ν•œ ν›„, 각각의 μ†ŒμΌ“μ„ κ°€λ¦¬ν‚€λŠ” μ†ŒμΌ“ 기술자λ₯Ό sd[0] sd[1]에 μ €μž₯ν•΄μ„œ λ°˜ν™˜ν•œλ‹€.
wirte ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ„œ μ†ŒμΌ“sd[0]에 λ¬Έμžμ—΄ Thisis from sd[0]을 μ“°λ©΄ μ†ŒμΌ“ sd[1]이 λ¬Έμžμ—΄ This is from sd[0]을 μ „μ†‘λ°›μŒμ„ μ•Œ 수 μžˆλ‹€.

socketpair ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ μ†ŒμΌ“ ν”„λ‘œκ·Έλž¨μ˜ κ΅¬ν˜„ - 두 ν”„λ‘œμ„ΈμŠ€ 간에

ν”„λ‘œμ„ΈμŠ€ κ°„μ˜ 톡신 κ°œλ…μ„ λͺ…ν™•νžˆ ν•˜κΈ° μš°ν•΄μ„œ fork ν•¨μˆ˜λ‘œ ν”„λ‘œμ„ΈμŠ€λ₯Ό ν•˜λ‚˜ 더 생성
ν˜„μž¬ 싀행쀑인 ν”„λ‘œκ·Έλž¨(ν”„λ‘œμ„ΈμŠ€)μ—μ„œ fork ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ μžμ‹ κ³Ό λ™μΌν•œ ν”„λ‘œμ„ΈμŠ€κ°€ ν•˜λ‚˜ 더 μƒμ„±λœλ‹€.
이 λ•Œ μ›λž˜μ˜ ν”„λ‘œμ„ΈμŠ€λ₯Ό λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λΌ ν•˜κ³ , μƒˆλ‘œ μƒμ„±λœ ν”„λ‘œμ„ΈμŠ€λ₯Ό μžμ‹ ν”„λ‘œμ„ΈμŠ€λΌκ³  ν•œλ‹€.

  • μžμ‹ν”„λ‘œμ„ΈμŠ€λŠ” ν”„λ‘œκ·Έλž¨μ˜ μ½”λ“œ λΆ€λΆ„, μ§€μ—­ λ³€μˆ˜, μ „μ—­ λ³€μˆ˜λ₯Ό λΉ„λ‘―ν•˜μ—¬ λ ˆμ§€μŠ€ν„°μ™€ 기타 곡유 μžμ› λ“± ν”„λ‘œκ·Έλž¨ 싀행에 ν•„μš”ν•œ λͺ¨λ“  ν™˜κ²½μ„ λ³΅μ œν•œλ‹€.
  • λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€μ™€ μžμ‹ ν”„λ‘œμ„ΈμŠ€ 사이에 μ†ŒμΌ“μ„ μ΄μš©ν•΄μ„œ 자료λ₯Ό μ†‘μˆ˜μ‹ ν•˜λŠ” ν”„λ‘œκ·Έλž¨
      1. socketpair ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ ν•œ 쌍의 μ†ŒμΌ“μ„ 생성
      1. fork ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄μ„œ μžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성
      1. λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λŠ” ν•œμͺ½ μ†ŒμΌ“μ„ μ΄μš©ν•΄μ„œ λ¬Έμžμ—΄ From Parentλ₯Ό μ „μ†‘ν•˜κ³ , μžμ‹ ν”„λ‘œμ„ΈμŠ€λ‘œλΆ€ν„° 자료λ₯Ό 전솑받아 좜λ ₯
      1. μžμ‹ ν”„λ‘œμ„ΈμŠ€λŠ” μ—°κ²°λœ ν•œμͺ½ μ†ŒμΌ“μ„ μ΄μš©ν•΄μ„œ λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λ‘œλΆ€ν„° 전솑받은 λ¬Έμžμ—΄ 좜λ ₯ν•˜κ³ , λ¬Έμžμ—΄ From Childλ₯Ό λΆ€λͺ¨ ν”„λ‘œμ„ΈμŠ€λ‘œ 전솑

        image
#include<stdio.h>
#include<string.h>
#include<sys/socket.h>

char data1[] = "From Parent";
char data2[] = "From Child";

int main(void){
        int pid;
        int sd[2], result;
        char buf[BUFSIZ];

        result = socketpair(PF_LOCAL, SOCK_STREAM, 0, sd);

        pid = fork();
        if(pid >0){
                close(sd[1]);

                read(sd[0], buf, BUFSIZ);
                printf("[parent:%d] %s\n", getpid(), buf);

                write(sd[0], data1, sizeof(data1));

                close(sd[0]);
        } else if(pid == 0){
                close(sd[0]);
                write(sd[1], data2, sizeof(data2));

                read(sd[1], buf, BUFSIZ);
                printf("[child:%d] %s\n", getpid(), buf);

                close(sd[1]);
        } else if(pid == -1){
                perror("fork()");
        }
}

κ²°κ³Όν™”λ©΄

image

fork ν•¨μˆ˜λ‘œ μžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό 생성

ν”„λ‘œμ„ΈμŠ€κ°€ fork ν•¨μˆ˜λ₯Ό λ§Œλ‚˜λ©΄ ν˜„μž¬ μ‹€ν–‰ 쀑인 ν”„λ‘œμ„ΈμŠ€μ˜ 이미지λ₯Ό κ·ΈλŒ€λ‘œ λ³΅μ‚¬ν•΄μ„œ μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€λ₯Ό λ§Œλ“ λ‹€.
ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄ μ£ΌκΈ°μ–΅ μž₯μΉ˜μ— λ‘œλ”©λ˜μ–΄ μ‹€ν–‰ 쀑인 μƒνƒœκ°€ λ˜λŠ”λ°, μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨(ν”„λ‘œμ„ΈμŠ€)의 ꡬ성
image

  • μ½”λ“œ(Code) : ν”„λ‘œκ·Έλž¨ μ½”λ“œκ°€ μ €μž₯λ˜λŠ” 곡간
  • μŠ€νƒ(Stack) : μ§€μ—­ λ³€μˆ˜κ°€ μ €μž₯λ˜λŠ” 곡간
  • 자료(Data) : μ „μ—­ λ³€μˆ˜κ°€ μ €μž₯λ˜λŠ” 곡간
  • νž™(Heap) : ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑에 λ™μ μœΌλ‘œ ν• λ‹Ήλ˜λŠ” 곡간
  • λ ˆμ§€μŠ€ν„°(Register) : ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ 자료 처리 등에 μ‚¬μš©λ˜λŠ” 곡간
  • μžμ›(Resource) : 파일 기술자 λ“± μžμ›μ— ν• λ‹Ήλ˜λŠ”