개발자 Q&A

개발하다 막혔다면? 여기서 질문하세요! 초보부터 고수까지, 함께 고민하고 해결하는 공간입니다. 누구나 자유롭게 질문하고 답변을 남겨보세요!

2025.06.27 12:12

socket_recvmsg 함수 사용 방법에 대해 질문드립니다.

목록
  • Scala마법사 22일 전 2025.06.27 12:12
  • 63
    1
제가 socket_recvmsg 함수를 사용하여 데이터를 받으려고 하는데, MSG_PEEK 플래그를 사용할 때 데이터가 실제로 수신되었는지 확인하는 방법을 모르겠습니다.

예를 들어, MSG_PEEK 플래그를 사용하여 1024바이트의 데이터를 수신하고 싶은데, 실제로 데이터가 수신되었는지 확인하는 방법은 무엇입니까?

또한, MSG_PEEK 플래그를 사용하여 데이터를 수신한 후, MSG_DONTWAIT 플래그를 사용하여 데이터를 다시 수신하는 방법이 궁금합니다.

제가 이해한 바에 따르면, MSG_PEEK 플래그를 사용하여 데이터를 수신하면 데이터가 실제로 수신되지 않으며, MSG_DONTWAIT 플래그를 사용하여 데이터를 수신하면 블로킹이 발생하지 않습니다.

이러한 플래그를 함께 사용할 때 발생할 수 있는 문제점이나 제한사항이 있는지 궁금합니다.

제가 잘못 이해한 부분이 있으면 알려주시고, 예제 코드를 함께 제공해주시면 감사하겠습니다.

감사합니다.

    댓글목록

    profile_image
    나우호스팅  22일 전



    MSG_PEEK 플래그를 사용하여 데이터를 수신한 후, 실제로 데이터가 수신되었는지 확인하는 방법은 다음과 같습니다.

    1. 수신한 데이터의 길이를 확인합니다. 수신한 데이터의 길이가 0이면 MSG_PEEK 플래그로 데이터가 수신되지 않았습니다.
    2. 수신한 데이터를 확인하여 실제로 수신한 데이터인지 확인합니다.

    MSG_PEEK 플래그를 사용하여 데이터를 수신한 후, MSG_DONTWAIT 플래그를 사용하여 데이터를 다시 수신하는 방법은 다음과 같습니다.

    1. MSG_PEEK 플래그로 데이터를 수신한 후, MSG_DONTWAIT 플래그를 사용하여 데이터를 다시 수신합니다.
    2. MSG_DONTWAIT 플래그로 데이터를 수신하면 블로킹이 발생하지 않습니다. 따라서 데이터가 실제로 수신되지 않았을 때도 블로킹이 발생하지 않습니다.

    MSG_PEEK 플래그와 MSG_DONTWAIT 플래그를 함께 사용할 때 발생할 수 있는 문제점은 다음과 같습니다.

    1. MSG_PEEK 플래그로 데이터를 수신한 후, MSG_DONTWAIT 플래그로 데이터를 다시 수신하면 데이터가 실제로 수신되지 않았을 때도 블로킹이 발생하지 않습니다. 따라서 데이터가 실제로 수신되지 않았을 때도 블로킹이 발생하지 않습니다.
    2. MSG_PEEK 플래그로 데이터를 수신한 후, MSG_DONTWAIT 플래그로 데이터를 다시 수신하면 데이터가 실제로 수신되었을 때도 블로킹이 발생하지 않습니다. 따라서 데이터가 실제로 수신되었을 때도 블로킹이 발생하지 않습니다.

    예제 코드는 다음과 같습니다.

    #hostingforum.kr
    c
    
    #include 
    
    #include 
    
    #include 
    
    #include 
    
    #include 
    
    #include 
    
    
    
    int main() {
    
        int sock = socket(AF_INET, SOCK_STREAM, 0);
    
        if (sock < 0) {
    
            perror("socket");
    
            exit(1);
    
        }
    
    
    
        struct sockaddr_in addr;
    
        addr.sin_family = AF_INET;
    
        addr.sin_port = htons(8080);
    
        inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);
    
    
    
        if (connect(sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
    
            perror("connect");
    
            exit(1);
    
        }
    
    
    
        char buf[1024];
    
        int flags = MSG_PEEK;
    
        int len = recvmsg(sock, &buf, sizeof(buf), &flags, NULL, NULL, NULL);
    
        if (len < 0) {
    
            perror("recvmsg");
    
            exit(1);
    
        }
    
    
    
        if (len == 0) {
    
            printf("MSG_PEEK 플래그로 데이터가 수신되지 않았습니다.n");
    
        } else {
    
            printf("MSG_PEEK 플래그로 데이터가 수신되었습니다. 데이터 길이: %dn", len);
    
        }
    
    
    
        flags = MSG_DONTWAIT;
    
        len = recvmsg(sock, &buf, sizeof(buf), &flags, NULL, NULL, NULL);
    
        if (len < 0) {
    
            perror("recvmsg");
    
            exit(1);
    
        }
    
    
    
        printf("MSG_DONTWAIT 플래그로 데이터가 수신되었습니다. 데이터 길이: %dn", len);
    
    
    
        close(sock);
    
        return 0;
    
    }
    
    


    이 예제 코드는 MSG_PEEK 플래그를 사용하여 데이터를 수신한 후, MSG_DONTWAIT 플래그를 사용하여 데이터를 다시 수신하는 방법을 보여줍니다.

    2025-06-27 12:13

  • 개발자 Q&A 포인트 정책
      글쓰기
      50P
      댓글
      10P
  • 전체 37,279건 / 52 페이지

검색

게시물 검색