programing

C/Unix의 소켓 쌍()

closeapi 2023. 9. 18. 21:26
반응형

C/Unix의 소켓 쌍()

저는 같은 시스템에 2개의 애플리케이션이 있어서 앞뒤로 소통해야 합니다.제가 조사한 바로는 이것이 프로세스 간 통신이라고 불리며 소켓 쌍()을 사용하는 것이 제 문제에 가장 적합한 방법이라고 생각합니다.

C에서 소켓 쌍()으로 소켓을 만드는 것부터 시작하려고 머리를 쥐어뜯고 있습니다.제가 알기로는 소켓은 매우 복잡한 주제이고 제가 초보 C 프로그래머가 되는 것은 분명 이 상황에 도움이 되지 않습니다.

지난 48시간 동안 구글 검색을 하고 튜토리얼 등을 읽었지만 아직도 검색이 되지 않습니다.개념은 이해하지만 코드가 너무 헷갈릴 뿐입니다.는 이 기사를 몇 번 읽었습니다: http://beej.us/guide/bgnet/html/single/bgnet.html, . 하지만 그것은 충분히 간단하지 않습니다.

누군가가 몇 가지 예시를 제공하거나(5학년 학생이 이해할 수 있도록 간단한) 좋은 튜토리얼을 알려줄 수 있습니까?

을 사용할 수 .socketpair를 모두 에만 해당됩니다

  1. socketpair- 이제 두 개의 소켓 파일 설명자(단일 파이프의 두 끝)가 있습니다.
    • 한쪽 끝을 부모로 지정하고 한쪽 끝을 자식으로 지정합니다.어느 쪽이든 상관없어요, 그냥 나중에 선택해서 계속해요.
  2. fork- 이제 두 가지 과정이 있습니다.
    1. 한다면fork0으로 돌아갔으니 당신은 아이입니다.상위 파일 설명자를 닫고 하위 설명자를 유지한 후 이 프로세스의 파이프 끝으로 사용합니다.
    2. 한다면fork0이 아닌 상태로 반환되었습니다. 당신이 부모입니다.하위 파일 설명자를 닫고 상위 파일을 유지한 후 파이프의 끝으로 사용합니다.
  3. 이제 두 개의 프로세스가 있습니다. 각 프로세스에는 동일한 파이프의 서로 다른 끝을 나타내는 하나의 파일 설명자가 있습니다. 모두 한 프로그램을 , 두 두스을고만출후른를는에오두한오g에는aer를hthteds두,e른ytgme후fork. 부모가 호출하는 경우write소켓에서, 아이는 소켓에서 그 데이터를 읽을 수 있을 것이고, 반대로

다음은 코드로 직접 번역한 것입니다.

void child(int socket) {
    const char hello[] = "hello parent, I am child";
    write(socket, hello, sizeof(hello)); /* NB. this includes nul */
    /* go forth and do childish things with this end of the pipe */
}

void parent(int socket) {
    /* do parental things with this end, like reading the child's message */
    char buf[1024];
    int n = read(socket, buf, sizeof(buf));
    printf("parent received '%.*s'\n", n, buf);
}

void socketfork() {
    int fd[2];
    static const int parentsocket = 0;
    static const int childsocket = 1;
    pid_t pid;

    /* 1. call socketpair ... */
    socketpair(PF_LOCAL, SOCK_STREAM, 0, fd);

    /* 2. call fork ... */
    pid = fork();
    if (pid == 0) { /* 2.1 if fork returned zero, you are the child */
        close(fd[parentsocket]); /* Close the parent file descriptor */
        child(fd[childsocket]);
    } else { /* 2.2 ... you are the parent */
        close(fd[childsocket]); /* Close the child file descriptor */
        parent(fd[parentsocket]);
    }
    exit(0); /* do everything in the parent and child functions */
}

이 코드는 샘플 코드일 뿐입니다.오류 검사와 합리적인 스트림 프로토콜을 모두 생략했습니다.


의 개별 프로그램(예: 클라이언트라는 실행 파일과 서버라는 실행 파일이 있는 경우)은 이 메커니즘을 사용할 수 없습니다.대신 다음을 수행할 수 있습니다.

  • UNIX 소켓 사용(한 호스트의 IPC 파이프가 파일 이름으로 식별되는 경우 - 클라이언트와 서버가 동일한 시스템에서 실행되는 경우에만 작동)
  • 또는 TCP/IP 소켓(IP 주소와 포트가 파이프를 식별하고 클라이언트와 서버가 다른 컴퓨터에 있을 수 있음)을 사용합니다.

소켓이 특별히 필요하지 않고 클라이언트서버가 동일한 컴퓨터에서 실행되도록 하고 싶다면 공유 메모리 또는 메시지 큐를 사용할 수도 있습니다.

socketpair은(는) 부모 프로세스와 자식 프로세스 간의 통신 또는 이를 사용해야 하는 프로세스가 공통 상위에서 파일 설명자를 상속할 수 있는 다른 경우에만 유용한 익명 소켓 쌍(일반적으로 unix/local 소켓)을 만듭니다.

관련이 없는(부모라는 의미에서) 프로세스 간의 통신을 수행하려면 다음을 사용해야 합니다.socket,bind,그리고.connect하나의 프로세스에서 리스닝 소켓을 생성하고 다른 프로세스에서 리스닝 소켓에 연결할 클라이언트 소켓을 생성하는 방법.

예, 두 프로세스 간의 통신을 위해서는 프로세스 간 통신 또는 IPC가 필요합니다.소켓은 통신 방법 중 하나일 뿐이며 일대일 연결을 구현해야 할 경우 유용합니다.즉, 요청 응답 방식으로 많은 클라이언트 프로세스와 통신하는 하나의 서버 프로세스입니다.IPC를 처음 접하신 분이시니 소켓 주소와 관련된 세부사항을 파악하기 어려워 보일 수도 있음은 이해할 수 있습니다.(비록 적절한 시간 안에 그것들이 쉽다는 것을 알게 되겠지만 :-)

당신의 문제에 대해서는 Pipe, FIFO, Message Queue와 같은 간단한 IPC 메커니즘을 사용하는 것을 추천합니다.소켓 페어를 어떻게 사용하시게 되었는지 잘 모르겠습니다.당신이 필요로 하는 IPC의 디자인이나 종류에 대해 언급한 바가 없으므로 사용 수준에 따라 Pipe나 FIFO 샘플 코드를 일부 책이나 인터넷에서 확인해 보는 것을 강력히 추천합니다.소켓보다 구현이 훨씬 쉬워 보이고 작업 속도가 빨라야 합니다.

TCP/IP를 사용합니다.다른 IPC 메커니즘(유닉스 도메인 소켓 및 SYSV IPC 등)도 있지만 TCP/IP는 여러 가지 이유로 사용하는 것이 좋습니다.여기 몇 가지가 있습니다.

  1. 웹에는 TCP/IP를 하는 방법을 설명하는 많은 튜토리얼과 기타 정보가 있습니다.
  2. 최신 시스템, 특히 Linux 및 *BSD는 유닉스 도메인 소켓이나 심지어 SYSV IPC와 비교할 때 TCP/IP를 사용하는 데 큰 불이익을 주지 않습니다.
  3. TCP/IP를 통해 통신하는 응용 프로그램에 사용할 수 있는 라이브러리와 프레임워크가 많이 있습니다.

TCP/IP를 사용하여 두 "프로그램" 간의 통신을 하지 않는 유일한 경우는 별도의 프로그램이 아니라 실제로 스레드인 경우입니다.

언급URL : https://stackoverflow.com/questions/11461106/socketpair-in-c-unix

반응형