accept 소켓 호출을 사용하여 클라이언트가 연결을 수신하는 서버를 구현하고 있습니다.소켓 호출 간 시간 간격 ie. Accept() 및 recv/send calls
accept가 발생하고 소켓을받은 후 첫 번째 recv/send 호출을하기 전에 약 10-15 초 동안 기다립니다.
클라이언트에 대한 send 호출은 errno = 32 즉 broken pipe로 실패합니다.
나는 클라이언트를 제어하지 않기 때문에 소켓 옵션 * SO_KEEPALIVE *를 허용 소켓에 설정했습니다.
const int keepAlive = 1;
acceptsock = accept(sock, (struct sockaddr*)&client_addr, &client_addr_length)
if (setsockopt(acceptsock, SOL_SOCKET, SO_KEEPALIVE, &keepAlive, sizeof(keepAlive)) < 0)
{
print(" SO_KEEPALIVE fails");
}
아무도 여기에 잘못 될 수 있으며 우리는 어떻게 클라이언트 소켓이 닫히지 않도록 할 수 있습니까?
참고 내가 여기에 추가 할 한 가지는 시간 간격 또는/수락하고 보내 recv를 호출 사이에 5 초 미만이없는 경우 예상대로 클라이언트 서버 통신이 발생한다는 것입니다.
Linux에서 오류 : ENOTCONN에 대해 errno = 32를 얻을 수 있습니다. 이는 소켓이 연결되어 있지 않고 대상이 지정되지 않았 음을 의미합니다. send/recv를 시작하기 전에 만든 syscalls이 에러를 반환하지 않는다는 것을 알아 두십시오. – Aravind
'send()'를 호출하기 전에'connect()'가 실제로 성공했는지 확인하고, 완전한 연결이 가능하다는 것을 알려 줬습니까? 소켓은 유휴 (idle) 기간 후에 정상적으로 닫히지 않으며, 10-15 초는'SO_KEEPALIVE'가 죽은 연결을 닫기에는 너무 짧고, 10-15 초는 외부 방화벽/라우터가 닫을 시간이 너무 짧습니다. 유휴 연결. 그래서 다른 일이 벌어지고 있습니다. 내 생각 엔 클라이언트 소켓을 올바르게 관리하지 않는다는 것입니다. –
@Aravind and Remy .. 예 차단하는 accept 호출이 유효한 accpetsock을 제공하기 때문에 connect()가 성공합니다. 또한 데이터가 클라이언트에서 두 번 또는 세 번 오류 32 받기 시작하기 전에 수신됩니다.내가 이미 언급했듯이 수락 및 보내기/받기 호출 사이에 대기가 없으면 클라이언트와 클라이언트가 작동하지 않습니다. – Rajat