먼저 코드를 입력하세요:
으아악전체 프로그램 흐름은 대략 다음과 같습니다.
서버가 시작된 후 Acceptor는 청취 상태에 있고 클라이언트는 연결을 요청합니다. 연결이 성공하면 서버는 newConnection 콜백을 호출하여 "잘 지내세요?" "를 클라이언트에게 전달하고 클라이언트는 이를 수락한 후 인쇄합니다.
다음은 오류 상황입니다.
gdb 디버깅을 사용할 때마다 ::write(sockfd, "how are you?n", 13);
就会接收到SIGPIPE
프로그램이 종료되는 것을 발견했습니다.
확인해 보니 프로그램이 SIGPIPE, Broken Pipe 신호를 수신했습니다.이유는 잘못된(연결되지 않았거나 연결이 끊어진) sockfd에 쓰기 때문이라고 합니다. 하지만 내 프로그램이 콜백 함수 쓰기를 위해 실행될 때 연결이 닫히지 않습니다. (디버깅을 위해 모든 코드에 나타나는 종료도 주석 처리했습니다)
그리고 gdb를 작성하기 위해 디버깅할 때 ll /proc/pid/fd
를 사용하여 현재 시스템 직업 설명자를 확인했는데, connfd가 여전히 존재합니다.
그래서 왜 SIGPIPE가 있는지 전혀 이해가 되지 않습니다. 조언 부탁드립니다!
我想大声告诉你2017-05-16 13:20:39
해결되었습니다. 원인은 ::accept의 세 번째 매개변수가 잘못 전달되었기 때문입니다
내 코드에서 accept 래퍼는 다음과 같습니다.
으아악통화 코드는
입니다. 으아악::accpet의 세 번째 매개변수는 변환된 sockaddr의 크기 대신 원래 sockaddr_in의 크기를 전달해야 한다는 오류가 있습니다. 다음과 같이 수정되었습니다:
으아악게시물man 2 accept
:
addrlen 인수는 값-결과 인수입니다. 호출자는 addr이 가리키는 구조의 크기(바이트)를 포함하도록 이를 초기화해야 합니다. 반환 시 피어 주소의 실제 크기가 포함됩니다.