2013-06-12 3 views
-2

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 초 미만이없는 경우 예상대로 클라이언트 서버 통신이 발생한다는 것입니다.

+0

Linux에서 오류 : ENOTCONN에 대해 errno = 32를 얻을 수 있습니다. 이는 소켓이 연결되어 있지 않고 대상이 지정되지 않았 음을 의미합니다. send/recv를 시작하기 전에 만든 syscalls이 에러를 반환하지 않는다는 것을 알아 두십시오. – Aravind

+1

'send()'를 호출하기 전에'connect()'가 실제로 성공했는지 확인하고, 완전한 연결이 가능하다는 것을 알려 줬습니까? 소켓은 유휴 (idle) 기간 후에 정상적으로 닫히지 않으며, 10-15 초는'SO_KEEPALIVE'가 죽은 연결을 닫기에는 너무 짧고, 10-15 초는 외부 방화벽/라우터가 닫을 시간이 너무 짧습니다. 유휴 연결. 그래서 다른 일이 벌어지고 있습니다. 내 생각 엔 클라이언트 소켓을 올바르게 관리하지 않는다는 것입니다. –

+0

@Aravind and Remy .. 예 차단하는 accept 호출이 유효한 accpetsock을 제공하기 때문에 connect()가 성공합니다. 또한 데이터가 클라이언트에서 두 번 또는 세 번 오류 32 받기 시작하기 전에 수신됩니다.내가 이미 언급했듯이 수락 및 보내기/받기 호출 사이에 대기가 없으면 클라이언트와 클라이언트가 작동하지 않습니다. – Rajat

답변

0

connect(2)send(2)은 클라이언트가 수행하는 두 개의 개별 시스템 호출입니다. 첫 번째는 TCP three-way handshake을 시작하고, 두 번째는 실제로 전송할 애플리케이션 데이터를 대기열에 넣습니다. 하지만 서버 측에

, 당신은 즉시 연결된 소켓에 send(2) -ing 데이터를 시작할 수 있습니다 성공 accept(2) (즉 -1에 대한 acceptsock을 확인하는 것을 잊지 마세요).

+0

내 질문을 이해하지 못했을 것 같은데. 그러나 설명을 가져 주셔서 감사합니다. 다시 해봐. 내가 -1에 대한 acceptsock에 대한 검사를하고 소켓이 유효한 하나로서 실패합니다. – Rajat

+0

실제 문제가 무엇인지 설명해야합니다. 응용 프로그램 수준 프로토콜이 소켓을 통해 사용되는 것과 같은 정보와 발생해야하는 상황에 대한 정보를 추가하십시오. –

0

After the accept happens and I receive the socket, i wait for around 10-15 seconds before making the first recv/send call.

왜? 클라이언트가 데이터를 보내는 데 오랜 시간이 걸린다는 것을 의미합니까? 또는 accept()recv() 사이의 서버에서 10-15 초 동안 서버를 사용할 수 있습니다. 그렇다면 왜 그렇습니까?

The send calls to the client fails with errno = 32 i.e broken pipe.

그래서 클라이언트가 연결을 종료했습니다.

Since I don't control the client, i have set socket option SO_KEEPALIVE in the accepted socket.

이렇게하면 클라이언트가 연결을 종료하지 않습니다.

Could anyone please tell what may be going wrong here

클라이언트가 연결을 종료하고 있습니다.

and how can we prevent the client socket from closing ?

수 없습니다.

+0

간단히 말하면, 여기서 할 수있는 일은 없다는 것입니다. 클라이언트에게 보낼 데이터를 처리해야하기 때문에 기다리고 있습니다. 따라서 다른 옵션은 없지만 클라이언트에 데이터를 보내기 전에 해당 데이터를 기다리는 것이 좋습니다. – Rajat

+0

@Rajat '짧게'나는 이미 내 선택의 말로 '너는 할 수 없다'라고 말했습니다. 내가하고 싶은 말을 말하지 마라. 나는 그런 종류의 일에 상당히 알레르기가 있습니다. 나는 이미 내가 말하고자하는 것을 말했고, 나는 바꿔 말 할 필요가 없다. 나는 당신이 내 질문에 대답하지 않았다는 것에 주목한다. – EJP