함수 shutdown (fd, options)의 동작에 대해 혼란 스러움

부디

저는 텍스트 기반 파일을 전송하는 데 사용되는 소켓 코드를 테스트하고 있으며 Unix Network Programming (Chinese Version) 책을 참조하여이 코드를 작성하고 있습니다 . 간단히 아래에 몇 가지 코드를 붙여 넣겠습니다.

내 serve_client 함수 :

void serve_client(int connfd, const char *filename, size_t filesize)
{
    char header[1024];
    int fd = open(filename, O_RDONLY, 0);
    char *file_mapped;
    if (fd == -1)
    {
        char *not_found = "HTTP/1.1 404 NOT FOUND\r\n";
        send(connfd, not_found, strlen(not_found), 0);
    }
    else
    {
        sprintf(header, "HTTP/1.1 200 OK\r\n");
        sprintf(header, "%sContent-Length: %u\r\n", header, filesize);
        sprintf(header, "%sContent-Type: text/plain; charset=utf-8\r\n\r\n", header);
        // send http response header
        send(connfd, header, strlen(header), 0);

        printf("Response headers:\n");
        printf("%s", header);

        file_mapped = (char *)mmap(0, filesize, PROT_READ, MAP_PRIVATE, fd, 0);
        close(fd);

        // send http response body
        send(connfd, file_mapped, filesize, 0);
        int unmapped = munmap(file_mapped, filesize);
        if (unmapped == -1)
        {
            perror("memory unmapped failed!");
            _exit(1);
        }
    }
}

제가 여러분에게 물어보고 싶은 몇 가지 질문이 있습니다.

  1. serve_client()함수가 성공적으로 반환 된 후에 는 최소한 필요한 데이터를 커널 버퍼에 완전히 복사하여 가까운 시일 내에 전송해야합니다. 내가 맞습니까?

  2. shutdown() 함수는 아래와 같이 호출됩니다.

    serve_client(connfd, path, st.st_size);
    shutdown(connfd, SHUT_WR); 
    // thread or process ends
    

이 책에 언급 된 팁을 확인하면이 옵션 SHUT_WR을 사용하면 커널 버퍼에 남아있는 데이터가 먼저 전송 된 다음 최종 FIN이 전송된다고합니다. 맞습니까?

  1. 아래 그림과 같이 WireShark로주고받은 데이터를 캡처합니다. https://i.imgur.com/Xu8gAgh.jpg 모든 데이터가 표시되기 전에 RST가 도착한 것을 확인했습니다. 클라이언트 예를 들어 wget또는 웹 액세스에 실패했습니다 . 어떤 조언이라도 좋을 것입니다.

이제 클라이언트가 연결을 닫고 서버가 FIN이 도착할 때까지 기다리도록하여이 문제를 해결했습니다. 효과가있다. 그러나 여전히 내가 원하는 것은 아닙니다. :(

while (1)
{
    ssize_t bytes_read = recv(connfd, buf, 1024, 0);
    if (bytes_read > 0)
    {
        continue;
    }
    else if (bytes_read == 0)
    {
        close(connfd);
        break;
    }
    else
    {
        // < 0
        // handle error
        close(connfd);
        break;
    }
} 

편집 이 질문에 대한 오해로 인해 죄송합니다. 덤프는 서버에서 보낸 RST를 보여주었습니다. 이것은 내가 말한 것과 같이 프로세스가 조기에 종료되었습니다. 이것이 이전 코드가 작동하지 않는 이유입니다. 모든 설명에 감사 드리며, 진행 상황을 더 잘 이해할 수 있도록 도와줍니다.

알크

프로세스 종료는 암시 적으로 close()모든 파일 / 소켓 설명자입니다. 그리고 이것이 문제입니다. 전송 후 닫으면 수신자 측에서 데이터가 손실 될 수 있습니다 (TCP 스택의 구현에 따라 다름).

서버가 소켓을 닫기 전에 클라이언트가 모든 데이터의 수신을 확인하도록하는 애플리케이션 레벨 프로토콜을 구현해야합니다.

요약하자면 : 애플리케이션 레벨 프로토콜의 일부로 소켓 폐쇄를 사용 하는 것은 신뢰할 수 없습니다 . 이러지 마세요.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

파이썬의 size () 함수에 대해 혼란 스러움

분류에서Dev

Bash의 변수 범위에 대해 혼란 스러움

분류에서Dev

변수 할당 및 정의에 대해 혼란 스러움 AngularJS JavaScript 노드

분류에서Dev

활동과 수업에 대해 혼란 스러움

분류에서Dev

Python에서 time.clock의 동작에 대해 혼란 스러움

분류에서Dev

맵 축소에서 축소 기능의 동작에 대해 혼란 스러움

분류에서Dev

서브 루틴에 전달 된 함수의 의도에 대해 혼란 스러움

분류에서Dev

concat ()의 동작과 반환하는 객체에 대해 혼란 스러움

분류에서Dev

Lua C 모듈 : 멤버 포함에 대해 혼란 스러움

분류에서Dev

Python (2.4.3)에서 set ()의 출력에 대해 혼란 스러움

분류에서Dev

R의 2 차원 요소에 대해 혼란 스러움

분류에서Dev

Douglas Crockford의 객체 기능에 대해 혼란 스러움

분류에서Dev

우분투 (Linux)의 보안에 대해 혼란 스러움

분류에서Dev

zookeeper의 트랜잭션 로그에 대해 혼란 스러움

분류에서Dev

Django의 ForeignKey 모델 관계에 대해 혼란 스러움

분류에서Dev

Android의 햅틱 피드백에 대해 혼란 스러움

분류에서Dev

VMWare의 다른 제품에 대해 혼란 스러움

분류에서Dev

코드의 큰 O 표기법에 대해 혼란 스러움

분류에서Dev

Idris의 중간 유형에 대해 혼란 스러움

분류에서Dev

Idris의 중간 유형에 대해 혼란 스러움

분류에서Dev

PHP (5.5.38)의 간단한 전환에 대해 혼란 스러움

분류에서Dev

nodeJS에 대해 혼란 스러움

분류에서Dev

가치에 대해 혼란 스러움

분류에서Dev

DropDownListFor에 대해 혼란 스러움

분류에서Dev

ContentType에 대해 혼란 스러움

분류에서Dev

WindowBuilder에 대해 혼란 스러움

분류에서Dev

EKEventStatus에 대해 혼란 스러움

분류에서Dev

Java 동기화 작동 방식에 대해 혼란 스러움

분류에서Dev

내부에 수백 개의 프로세서가있는 GPU에 대해 혼란 스러움

Related 관련 기사

  1. 1

    파이썬의 size () 함수에 대해 혼란 스러움

  2. 2

    Bash의 변수 범위에 대해 혼란 스러움

  3. 3

    변수 할당 및 정의에 대해 혼란 스러움 AngularJS JavaScript 노드

  4. 4

    활동과 수업에 대해 혼란 스러움

  5. 5

    Python에서 time.clock의 동작에 대해 혼란 스러움

  6. 6

    맵 축소에서 축소 기능의 동작에 대해 혼란 스러움

  7. 7

    서브 루틴에 전달 된 함수의 의도에 대해 혼란 스러움

  8. 8

    concat ()의 동작과 반환하는 객체에 대해 혼란 스러움

  9. 9

    Lua C 모듈 : 멤버 포함에 대해 혼란 스러움

  10. 10

    Python (2.4.3)에서 set ()의 출력에 대해 혼란 스러움

  11. 11

    R의 2 차원 요소에 대해 혼란 스러움

  12. 12

    Douglas Crockford의 객체 기능에 대해 혼란 스러움

  13. 13

    우분투 (Linux)의 보안에 대해 혼란 스러움

  14. 14

    zookeeper의 트랜잭션 로그에 대해 혼란 스러움

  15. 15

    Django의 ForeignKey 모델 관계에 대해 혼란 스러움

  16. 16

    Android의 햅틱 피드백에 대해 혼란 스러움

  17. 17

    VMWare의 다른 제품에 대해 혼란 스러움

  18. 18

    코드의 큰 O 표기법에 대해 혼란 스러움

  19. 19

    Idris의 중간 유형에 대해 혼란 스러움

  20. 20

    Idris의 중간 유형에 대해 혼란 스러움

  21. 21

    PHP (5.5.38)의 간단한 전환에 대해 혼란 스러움

  22. 22

    nodeJS에 대해 혼란 스러움

  23. 23

    가치에 대해 혼란 스러움

  24. 24

    DropDownListFor에 대해 혼란 스러움

  25. 25

    ContentType에 대해 혼란 스러움

  26. 26

    WindowBuilder에 대해 혼란 스러움

  27. 27

    EKEventStatus에 대해 혼란 스러움

  28. 28

    Java 동기화 작동 방식에 대해 혼란 스러움

  29. 29

    내부에 수백 개의 프로세서가있는 GPU에 대해 혼란 스러움

뜨겁다태그

보관