TCP 소켓 인데 데이터가 안 들어와요 ㅠ.ㅠ
일전에 질문 올렸고...
그에 대해 답글 달아주신분 말씀대로 이것저것 해 밨는데도 해결이 안 되어
답답한 마음에 다시 올립니다...ㅠ
TCP 소켓을 사용하고 있구요...
클라이언트와 서버가 통신을 하는데...
클라이언트는 서버에서 보내는 데이터를 수신함과 동시에
서버와의 소켓이 잘 살아있는지 확인메시지를 전송합니다.
서버는 실시간으로 데이터를 전송하고, 클라이언트가 전송한 소켓 확인 메시지에 응답을 하구요...
이는 쓰레드를 생성하여 데이를 수신하고, 소켓 확인 메시지를 전송합니다.
그런데 가끔 프로세스를 구동시킨 직후나 구동되고 얼마 지나지 않아. 한참 후에도...
클라이언트가 데이터를 받지 못 하는 상황이 발생합니다...
이 상황에서
서버는 계속적으로 데이터를 전송하고 또한 클라이언트가 보낸 소켓 확인 메시지를 수신하여 응답메시지를 전송합니다.
다만 클라이언트는 자신의 메시지만 계속 발송할 뿐, 서버가 보낸 응답 메시지와 데이터를 수신하지 못합니다.
netstat으로 양쪽의 Send,Recv-Q를 살펴 보아도 정상적으로 수치가 올라갔다가 다시 0으로 되고...
소켓도 ESTABLISHED로 설정되어 있습니다.
또한 서버에서 전송하는 데이터나 메시지의 끝에 구분자를 두어서 클라이언트가 이를 수신할때
거기까지만 읽어 처리하게 하고 있습니다.
여기서 질문!!!
끝에 구분자 이외에 '/r/n' 를 넣어야 하는 건가요?
아니면 어떤 방법으로 접근해야 문제점을 해결할 수 있을까요...?
프로토콜은 어떻게 되시는지?
자체 제작 프로토콜이신가요? 아니면? 어떤?
HTTP 프로토콜 같은 경우.. TCP 패킷에... HTTP 헤더와 HTTP 데이터를 데이터 형태로.
실어서 보내게 되는데..
헤더 정보에 반드시 지켜줘야하는 /r/n 이나 공백등의 형식에 맞는 구분자(?)를 반드시
입력해야합니다만.. 이건 여담이고.. 관련이 없겠죠;;
아무튼.. 프로토콜이라던지 일반 echo 서버/클라이언트랑 어떻게 다른지 등을..
알려주시면.. 아마 도움을 주실 가능성이 조금 높아질 것 같습니다..
감사합니다.
제가 그런 기본적인 것들도 적어 놓지 않았네요...
죄송합니다 ㅠㅠ
환경은 Sun 장비에 Unix C를 사용하고 있습니다.
기본 TCP/IP로 통신하고 있구요..
소켓 관련 함수도...
표준함수에서 제공하는 socket()으로 fd 얻고 connect 해서 send/recv 하는 식으로 하고 있구요...
서버도 기본 구조로 사용하고 있습니다.
쓰레드에 하나의 연결만 사용하기에 다중으로 하는것도 아니고.....
일반 echo는 무얼 말씀하시는지 ^^;;
데이터를 수신하면 이래저래 로그를 찍게끔 해 놨는데...
전혀 로그도 남지 않네요...
바로 이전 데이터가 완료된 로그만 남아있구..
시작부터 로그가 안 찍히는데 큐에 남아있지 않은걸로 봐서는 recv이후에 문제인듯 하고..
recv이후 로그찍기 전까지 문제 생길게 엄는데 난감하네요 ^^;
댓글 달기