네트워크 프로그래밍..

ctcquatre의 이미지

TCP/IP네트웍 프로그래밍을 공부하고 있습니다.

짧은 지식으로나마 뭐 하나 만들어보고 싶어서.
주기적으로 Linux 프로그램과 Windows프로그램간의
데이타를 주고 받는 형태를 생각하고 있습니다.
뭐 채팅과 비슷한거죠.
Linux는 콘솔환경에 Server가 되는거고
Windows는 Client로

문제는 Linux의 Send와 Recv쪽입니다.

windows프로그램은 Winapi에서 넌블록킹을 지정하고 이벤트로 처리하면
send와 recv 필요에 호출할수있으니까 그리 문제될건
없다고 생각하는데..

linux쪽은 제가 네트웍 플밍의 지식이 짧은 지라..
통신 방법이 떠오르지 않습니다.
해본거라곤 EchoServer와 EchoClient를 제작해본게 고작입니다.

그래서인지
필요에 의해 Send와 Recv를 호출할 방법이 머리속에
쉽게 떠오르지 않네요.
Echo라고 해봤자 Server는

Recv(.....);
Send(....); 

이렇게 받을걸 되돌리면 되니까요.

하지만 채팅은 저런식으로가 아니고

데이타가 오면 Recv처리를 해야 하고
그 순간이라도 보낼데이타가 있으면 send처리를 해야하는데

이것을 어떻게 처리하죠?
혹시나해서 signal부분도 짧막한 문서를 훑어봤는데.
흠.. 명확히 풀리지가 않네요 :shock:

조언을 부탁드립니다.
더불어 오늘 날씨가 참 좋네요.. 좋은 하루되세요.

madhatter의 이미지

쓰레드가 필요한 시점입니다..

ctcquatre의 이미지

스레드는 쓰고 있습니다.

main()
{
listen(....)
pthread_create(....,Myaccept(),...);
}

return Myaccept()
{
accept(...)

recv(...);
send(...);

}
이런 형식으로 스고 있습니다.
물론 accept()부분은 그냥 넣어본것이고 적절한곳에 넌블럭으로 넣어야게죠.

제가 스레드부분도 몇페이지에 해당하는 문서만 읽어본지라
내공이 부족해서 그런데
어떻게 recv()와 send()를 스레드를 써서 호출될 필요성에 의해
작업을 하게 할수있을까요?

제가 무리한 설명을 바라는것이라면

대충 짧막하게 개념정도로만 설명해주셔도 좋습니다.
"어떤 걸 참고하고, 어떤어떤 형식으로 돌아가게 만들면 될것이다."

이런식으로요.. 당장 이해가 안된다 하더라도 다시 공부해서 이해하겠습니다.

Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.

garuna의 이미지

select 나 epoll 등으로 read 할 데이터가 있는지 확인하면 되지 않을까요???

nthroot의 이미지

역시나 넌블락킹 하시면 됩니다. 방법은 윗분 답변에..

------식은이 처------
길이 끝나는 저기엔 아무 것도 없어요. 희망이고 나발이고 아무 것도 없어.

ctcquatre의 이미지

답변 감사드립니다.. 다행히 힌트를 얻어
더 많은 것을 공부하게 되었습니다.

부과적으로 의문이생겨서 이렇게 또 물어봅니다.
select에 관해 좀 살펴봤습니다.
문제는 해결될것 같은데 효율성에서 좀 걸리더군요.
반면에 epoll은 비효율성은 커버할수있으나
커널 2.4에서는 패치를 통해 제공하고
2.6버젼때부터 정식지원 되더군요. 그래서 쓰기가 좀 그렇고

일단 select를 써서 구현을 한번 생각해봤습니다.


main()
{
    .
    .
    listen(...)
    clntsock=accept(...) // non-block처리
    .
    . 다른 할일들
}

블럭신호가 보낸 처리 함수
{
 
    pthread_create(...,,(void *)myThreadFunc,clntsock);
   
}

이렇게 다중 연결을 쉽게 처리할수 있게 되었습니다.
문제는 아래 thread에서 생깁니다.
void MythreadFunc(sock)
{
   if(select(maxDescpt,Read,NULL,NULL,time)!=0);
   { 
       if(FD_ISSET(....))   
       {
           recv(.....);

           패킷처리...
       }
   }
}        

이렇게 했을때 그 쓰레드에서 1개의 식별자에 대한 감시만 하면되는데 select 특성상 현제 열려있는 모든 식별자를 감시하므로
많은 연결이 있을경우 효율성이 급격히 떨어질것 같더군요.
만약 accept가 100번발생되면
스레드는 100개가 생기고 각 스레드마다 select는 100개의 식별자를
감시하게 되므로 10000번의 숫자가 나오게 되는것 같습니다.

흠.. 제가 생각하는게 맞는지요?
select를 스레드부분에 두지 말고 상위에 두어
스레드부분에는 해당 식별자값만 넘겨주어야 하는걸까요?

보통 server 데몬이 이런식으로 패킷을 처리하지 않을것 같다라는
생각도 들고.. 잡생각이 굉장이 많아 지는군요.

Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.

alsong의 이미지


main()
{
	th_procces 5개 생성
	pause();
}

th_process()
{
               while(1) {
	lock()
		accept();
	unlock();
	데이터 처리;
                }
}

다른 모델하려면

main()
{
	while(1) {
    select()
	   if(acptsock IO발생인가) {
		   accept();
	   }
	   else
		   for() {
			   다른 IO처리
		}
	}
}

또다른 모델로 하려면

main()
{
	th_process 5개 생성;
	while() {
	accept();
	현재 가장 작은 fd처리하는 th_process에게 넘김.
	}
}
	

th_process()
{
	 int socklist[1024];
	 select()
	 {
		 데이터 처리
	 }
}

셀렉트 없는 초간단 모델로 하자면

main()
{
	while(1) {
		sock = accept();
		th_process(sock);
	}
}

th_process()
{
	데이터 처리
}

데이터 처리 응용
이건 조금더 여러가지 더 넣어야 되요...
th_process()
{	
	while(1) {
		select(1/2초마다 타임아웃) {
		if(maxth < 1억보다 큰가(꿈의 PC라고 가정 :))			
			th_dataprocess(data) 하나 생성;
		else
			insertqueue(data);
		}
	}
}

th_dataprocess()
{
	데이터 처리
}

틀리더라도 고수분들이 고쳐주시길

다른 모델하려면

main() 
{ 
   while(1) { 
    select() 
      if(acptsock IO발생인가) { 
         accept(); 
      } 
      else 
         for() { 
            다른 IO처리 
      } 
   } 
} 

이모델은 하다보면 손대야 될거 많음 :)

그나저나 백수 언제 탈출하냐... ㅡㅡ; 배고파라.

ctcquatre의 이미지

alsong님 자세한 답변 감사드립니다.
오늘 아침부터 다시 쭉 자료를 찾아다니다가 RTS라는걸 알게되었습니다.

select의 비효율을 커버할수있다더라구요.
그래서 rts쪽으로 하기로 했습니다.
성의껏 답변 달아주셨는데.. 좀 머쓱합니다. :oops:

ㅎㅎ 그런데 rts문서 이것저것 공부하고 짠 프로그램에도
역시나 문제가 발생하더군요.
이거 꾀나 골치아파 질것 같습니다.
스레드에서 실행시킨 sigwaitinfo()문이 프로그램전체를 블럭시켜버리는... --;

여하튼 모두들 감사드리고, 좋은 일 생기세요.

Chaos to Cosmos,
Chaos to Chaos,
Cosmos to Cosmos,
Cosmos to Chaos.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.