UDP통신으로 Server에 데이터 보내기

firehole의 이미지

안녕하세요?

오늘 인사를 두번이나 하게 되네요....
제가 프로그램을 작성하는데 버그가 있어서 이렇게 글을 올립니다.
소스를 우격다짐으로 작성해서 그런지 어떻게 해야할지 몰라 이렇게 글을 올리게 되었습니다.

우선 저는 udp통신으로 클라이언트(5대 미만)에서 4초마다 서버에 cpu사용량을 보내 서버에서는 받은 ip, cup정보로 가장 idle한 클라이언트로 load balace하는 프로그램을 작성하고 있습니다.

서버에서는 클라이언트가 접속할때마다 해당 쓰레드가 생성되어 클라이언트가 8초, 즉 4초마다 도착할 데이터가 2회이상 도착하지 않을시 해당 노드, 쓰레드를 제거하려합니다.

문제로는
1. 클라이언트가 1대 접속하고 잠시후 "CTRL + C"로 시그널이 발생하면
정상적으로 8초가 지나면 노드, 쓰레드가 제거가 안된다.
예로 들어,쓰레드 함수에 작성된 printf로 출력하면 8초 후에도
출력된다.

2. 1번과 거의 동일하나 여러 클라이언트가 접속하고 하나씩 종료할시
정상적으로 노드와 쓰레드가 제거되지 않은것으로 추정된다.
8초 후에도 해당 ip, status=0으로 찍힌다.
그리고 마지막 남은 클라이언트를 종료하면 계속 남은 ip, status=1
이 출력된다. 다시 접속을 끊었던 클라이언트가 다시 접속하면 그때서야
남아있던 ip, status = 0이 된다.

3. 3개의 클라이언트가 접속했을시 동시에 클라이언트가 접속을 끊으면
8초후에도 계속 살아있다.

제가 소스를 좀 보시고 어디가 이상있는지 좀 알려주세요..
답변 부탁드립니다.

File attachments: 
첨부파일 크기
Binary Data test.tar.gz17.94 KB
codebank의 이미지

무한루프가 아닌가요???
Thread 함수인 schedule_func()에보면 for문이 cout과 sleep()만을 계속적으로
돌리기 때문에 자기자신은 죽지 않게 되겠네요.

for( ; ; ) {	
		cout << "From addr : " << node[i].IP << ", status = " << node[i].udp_status << endl; //노드가 정상적으로 제거됨과 동시에
											// 쓰레드가 제거되기 때문에 제거된 노드정보는 찍히면 안됨.
		sleep(2); //2초 마다 출력

		vector<NODEInfo>::iterator pFound = find_if(node.begin(), node.end(), my_equal_obj());
		if (pFound != node.end()) {
			  node.erase(pFound); 
			  status = pthread_cancel(p_thread[i]);   //노드가 제거됨과 동시에 해당 쓰레드 제거
			  if(status != 0)
				printf("Cancel thread %d\n", status);
		}
	}

로 저 비교문이 for(;; )안에 있어야할것 같은데요...

------------------------------
좋은 하루 되세요.

firehole의 이미지

답변 고맙습니다.
덕택에 소스는 수정을 했습니다.
수고하세요..

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.