TCP 연결 릴레이 질문
글쓴이: declspec / 작성시간: 일, 2012/11/25 - 3:14오후
안녕하세요, 간만에 질문올립니다.
TCP/IP 통신을 하는 프로그램 A, B 가 있습니다.
B 가 소켓을 열고 A 가 여기에 connect 하면
B 가 데이터를 A 에게 전송합니다.
이 두 프로그램은 문제없이 잘 작동했습니다.
그런데 이것을 아래와 같이 바꿨더니 이상해집니다.
프로그램 C 가 TCP 소켓 2개를 엽니다.(socket1, socket2)
프로그램 B 는 socket1 과 연결됩니다.
프로그램 A 는 socket2 와 연결됩니다.
프로그램 C 는 아래의 무한루프를 돌리면서 socket1 에서 읽은 데이터를
socket2 로 넘겨줍니다.
즉, A 와 B 의 중간에서 TCP 데이터를 릴레이 시켜주는것이죠.
저는 이렇게해도 A 와 B 가 똑같이 잘 돌아갈줄 알았습니다.
그런데 처음에 잠시 잘 돌아가다가, A 가 엉뚱한(B 가 보내지도 않은) 데이터를
수신하고 죽어버립니다.
왜 이런 현상이 일어날까요?
아래의 코드는 리눅스 C 코드인데
참고로 recv 가 request size 만큼 수신하는게 보장이 안되니까
그걸 보장할수있는 my_recv 를 만들었습니다.
아무리 디버깅하고 생각해봐도 왜 에러가 나는지 모르겠네요
C 는 단지 A 와 B 의 TCP 스트림을 중계만 해주는건데
A 와 B 가 직접 연결해서 통신할땐 잘되던게 왜안되는지...
TCP 는 UDP 처럼 손실에 대한 걱정도 없는데...?
도와주세요 ㅠㅠ
char buf[BUFSIZE]; while(1){ // recv a packet segment if( my_recv(socket1, buf, BUFSIZE) <= 0 ){ return 0; } if( send(socket2, buf, BUFSIZE, MSG_NOSIGNAL) != BUFSIZE ){ return 0; } } int my_recv(int sd, char* p, unsigned int len){ // recv a packet segment unsigned int ssize=0; int d; while(ssize < len){ if( (d=recv( sd, p+ssize, len - ssize, 0))<=0){ return -1; } ssize += d; } return ssize; }
Forums:
그리고
참고로, my_recv 를 안쓰고 아래처럼해도 똑같습니다 ㅠㅠ
자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.
자체해결;;;
해결됬습니다;
TCP 문제도, 릴레이서버 문제도 아닌 완전 다른곳에서
엉뚱하게 멍청한 실수를 했었네요 ㅠㅠ
TCP heart beat 시그널을 타이머로 주던것을
릴레이커넥션으로 바꿀때 처리를 안해줘서... 데이터속에 시그널이 들어가버려서
조금 돌아가다가 타이머가 작동할때 죽는거였네요 ㅠㅠㅠㅠㅠㅠ
어제 하루종일 해결이안되서 질문을 올리니
이상하게 바로 발견이되네요
그것참 묘하네요 ㅠㅠ
자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.
댓글 달기