찾다

 >  Q&A  >  본문

linux - 클라이언트-서버 프로그램 오류 프로그램이 SIGPIPE 신호, 깨진 파이프를 수신했습니다.

먼저 코드를 입력하세요:

으아악

전체 프로그램 흐름은 대략 다음과 같습니다.
서버가 시작된 후 Acceptor는 청취 상태에 있고 클라이언트는 연결을 요청합니다. 연결이 성공하면 서버는 newConnection 콜백을 호출하여 "잘 지내세요?" "를 클라이언트에게 전달하고 클라이언트는 이를 수락한 후 인쇄합니다.

다음은 오류 상황입니다.
gdb 디버깅을 사용할 때마다 ::write(sockfd, "how are you?n", 13);就会接收到SIGPIPE프로그램이 종료되는 것을 발견했습니다.

확인해 보니 프로그램이 SIGPIPE, Broken Pipe 신호를 수신했습니다.이유는 잘못된(연결되지 않았거나 연결이 끊어진) sockfd에 쓰기 때문이라고 합니다. 하지만 내 프로그램이 콜백 함수 쓰기를 위해 실행될 때 연결이 닫히지 않습니다. (디버깅을 위해 모든 코드에 나타나는 종료도 주석 처리했습니다)

그리고 gdb를 작성하기 위해 디버깅할 때 ll /proc/pid/fd를 사용하여 현재 시스템 직업 설명자를 확인했는데, connfd가 여전히 존재합니다.

그래서 왜 SIGPIPE가 있는지 전혀 이해가 되지 않습니다. 조언 부탁드립니다!

仅有的幸福仅有的幸福2752일 전764

모든 응답(1)나는 대답할 것이다

  • 我想大声告诉你

    我想大声告诉你2017-05-16 13:20:39

    해결되었습니다. 원인은 ::accept의 세 번째 매개변수가 잘못 전달되었기 때문입니다

    내 코드에서 accept 래퍼는 다음과 같습니다.

    으아악

    통화 코드는

    입니다. 으아악

    ::accpet의 세 번째 매개변수는 변환된 sockaddr의 크기 대신 원래 sockaddr_in의 크기를 전달해야 한다는 오류가 있습니다. 다음과 같이 수정되었습니다:

    으아악

    게시물man 2 accept:

    addrlen 인수는 값-결과 인수입니다. 호출자는 addr이 가리키는 구조의 크기(바이트)를 포함하도록 이를 초기화해야 합니다. 반환 시 피어 주소의 실제 크기가 포함됩니다.

    회신하다
    0
  • 취소회신하다