소켓 프로그램에 관한 질문입니다.

kdonny의 이미지

처음에는 데이터 송수신이 되는데 두번째는 서버에서 수신대기모드??

말하자면 제가 잘몰라서요.

처음에 접속해서 데이터를 가져오는것은 되는데 두번째로 가져올려면 아무런

반응이 없네요.. 고수님들의 조언을 부탁드림니다...

while(1)
	{
		printf("메세지 송신 대기 모드... \n");
		clilen  = sizeof(cliaddr);
		connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen);
		
		if( (childpid = fork() )== 0)
		{
			//메인서버 시작
			printf(" 클라이언트 접속 \n");
			inputFunc(connfd);
			
			exit(0);
			
		}//if( (childpid) = Fork()) == 0)
		
		close(connfd);
		
	}//for(  ;  ;  )
	
	close(listenfd);
}//int main()



int inputFunc(client_sockfd)
int client_sockfd;
{
	
	//char path[30];						//서비스를 해줄 미디어 화일의 경로가 조합될 곳
	int  key;	
	char *strNumber;
	char *strNumber1;
	char *strNumber2;
	int recvresult, i;
	int GVMPacketSize;
	//char receiveData[PACKETSIZE];

	printf("//----------------------------------------// \n");
	printf("inputFunc함수 실행 \n");
		
	memset(receiveData, '\0', PACKETSIZE);
				
	recvresult = read(client_sockfd, receiveData, PACKETSIZE);
				
	printf("recvresult : %d  \n", recvresult);

제가 알기로는 항상 inputFunc 함수에서 대기 모드로 되어있어야 하는 걸로 알고 있는데 처음에만 그렇고 두번째는 그전까지만 들어가 있어요..
"inputFunc함수 실행" 까지 들어가져야 하는 걸루 알고있는데 안되서 그럼니다...

stoneshim의 이미지

Quote:
두번째는 서버에서 수신대기모드??

이 의미가 client가 connect 를 두번째 요청했을때
printf("메세지 송신 대기 모드... \n"); 

이 코딩의 출력까지만 나온다는 말씀이시죠?

코딩에서 크게 문제되는 부분은 없어보입니다.

혹시 모르니까 fork()의 음수 리턴도 체크해 보시구요... child 프로세스에서 inputFunc() 함수 호출전에 close(listenfd);를 하세요.

서버 프로세스가 어떻게 작동하는지 gdb나 truss(solaris에서) strace(linux에서)를 사용해서 보시는것도 의미있을것 같습니다.

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

kildongp의 이미지

프로세스 상태부터 체크하셔야 할듯 생각이 됩니다.

지금 모드가 블럭킹 모드로 되어 있어서 차일드가 커낵션이 끝나지 않았는지도 체크 하시고요.

if( (pid = fork()) == 0){
	printf("Fork ok \n");
}else if( pid < 0){
	printf("Fork Fail\n");
}else{
	printf("Process is %d == This is parent\n ",pid);
}
고물의 이미지

while(1) 
   { 
      printf("메세지 송신 대기 모드... \n"); 
      clilen  = sizeof(cliaddr); 
      connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &clilen); 
       
      if( (childpid = fork() )== 0) 
      { 
         //메인서버 시작 
         printf(" 클라이언트 접속 \n"); 
         inputFunc(connfd); 
          
         exit(0); 
          
      }//if( (childpid) = Fork()) == 0) 
       
      close(connfd); // 이 부분이 (오류)입니다. 닫으면 안되고 Child에서 닫아야 됩니다. 부모에서 닫아버리면 inputFunc에서도 읽을 수 없습니다. fork를 하였을때 시스템 자원의 복사와 공유에 대해서 생각해보시면 될꺼에요.
       
   }//for(  ;  ;  ) 
    
   close(listenfd); 
}//int main() 

recvresult = read(client_sockfd, receiveData, PACKETSIZE); // 이 부분도 보정이 필요합니다. 장난 치실꺼 아니라면 무조건 nonblock mode 프로그래밍을 하세요

stoneshim의 이미지

Quote:
close(connfd); // 이 부분이 (오류)입니다. 닫으면 안되고 Child에서 닫아야 됩니다. 부모에서 닫아버리면 inputFunc에서도 읽을 수 없습니다. fork를 하였을때 시스템 자원의 복사와 공유에 대해서 생각해보시면 될꺼에요

잠시 착각하신게 아닌가 싶습니다.
accept() 호출로 생긴 connected fd가 fork()로 인해 복사가 되었고, 이때 kernel에서 관리하는 file table entry의 reference count가 증가되므로 parent에서 connected fd를 close() 할때 FIN이 client로 전달되지 않습니다.

accept() 후 fork() 를 호출하고 parent는 connected FD를 close(), child는 listening FD를 close()한 후 서비스 하는 형태는 UNIX Network server 프로그래밍의 고전적인 방법입니다.

우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자

고물의 이미지

그렇군요. file descriptor reference count가 2개로 되니 한개가 감소해도 0이 안되니 안닫히네요..

좀 더 생각해야겠습니다. 지송...

xfmulder의 이미지

이미 찍었는데 화면에 안보이는 거라면 ..

printf("inputFunc함수 실행 \n"); 다음에
fflush(stdout) ; /// <---- 해보시죠.

내 자식들도 나처럼 !!

xfmulder의 이미지

제가 알기로는 항상 inputFunc 함수에서 대기 모드로 되어있어야 하는 걸로 알고 있는데 처음에만 그렇고 두번째는 그전까지만 들어가 있어요..
"inputFunc함수 실행" 까지 들어가져야 하는 걸루 알고있는데 안되서 그럼니다...

위에 이건 무슨말씀이신지 ???

클라이언트가 두번째로 접속( Client가 connect() ) 성공한 후에 inputFunction 을 타게 되는데 .....

내 자식들도 나처럼 !!

댓글 달기

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