TCP 연결 릴레이 질문

declspec의 이미지

안녕하세요, 간만에 질문올립니다.

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;
}

declspec의 이미지

참고로, my_recv 를 안쓰고 아래처럼해도 똑같습니다 ㅠㅠ

	char buf[BUFSIZE];
 
	int n;
	while(1){
			// recv a packet segment
			if( (n=recv(socket1, buf, BUFSIZE, 0)) <= 0 ){
					return 0;
			}
 
			if( send(socket2, buf, n, MSG_NOSIGNAL) < 0 ){
				return 0;
			}
	}

자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.

declspec의 이미지

해결됬습니다;
TCP 문제도, 릴레이서버 문제도 아닌 완전 다른곳에서
엉뚱하게 멍청한 실수를 했었네요 ㅠㅠ

TCP heart beat 시그널을 타이머로 주던것을
릴레이커넥션으로 바꿀때 처리를 안해줘서... 데이터속에 시그널이 들어가버려서
조금 돌아가다가 타이머가 작동할때 죽는거였네요 ㅠㅠㅠㅠㅠㅠ

어제 하루종일 해결이안되서 질문을 올리니
이상하게 바로 발견이되네요
그것참 묘하네요 ㅠㅠ

자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.