소켓 프로그램에 관한 질문입니다.
글쓴이: kdonny / 작성시간: 목, 2003/03/27 - 5:02오후
처음에는 데이터 송수신이 되는데 두번째는 서버에서 수신대기모드??
말하자면 제가 잘몰라서요.
처음에 접속해서 데이터를 가져오는것은 되는데 두번째로 가져올려면 아무런
반응이 없네요.. 고수님들의 조언을 부탁드림니다...
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함수 실행" 까지 들어가져야 하는 걸루 알고있는데 안되서 그럼니다...
Forums:
[quote]두번째는 서버에서 수신대기모드?? [/quote]이 의미
이 의미가 client가 connect 를 두번째 요청했을때
이 코딩의 출력까지만 나온다는 말씀이시죠?
코딩에서 크게 문제되는 부분은 없어보입니다.
혹시 모르니까 fork()의 음수 리턴도 체크해 보시구요... child 프로세스에서 inputFunc() 함수 호출전에 close(listenfd);를 하세요.
서버 프로세스가 어떻게 작동하는지 gdb나 truss(solaris에서) strace(linux에서)를 사용해서 보시는것도 의미있을것 같습니다.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
Re: 소켓 프로그램에 관한 질문입니다.
프로세스 상태부터 체크하셔야 할듯 생각이 됩니다.
지금 모드가 블럭킹 모드로 되어 있어서 차일드가 커낵션이 끝나지 않았는지도 체크 하시고요.
close 오류
recvresult = read(client_sockfd, receiveData, PACKETSIZE); // 이 부분도 보정이 필요합니다. 장난 치실꺼 아니라면 무조건 nonblock mode 프로그래밍을 하세요
[quote] close(connfd); // 이 부분이 (오류
잠시 착각하신게 아닌가 싶습니다.
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이 안되니 안닫히네요..
좀 더 생각해야겠습니다. 지송...
혹시 화면에 만 안보이는거 아닌지...
이미 찍었는데 화면에 안보이는 거라면 ..
printf("inputFunc함수 실행 \n"); 다음에
fflush(stdout) ; /// <---- 해보시죠.
내 자식들도 나처럼 !!
무슨뜻인지??
제가 알기로는 항상 inputFunc 함수에서 대기 모드로 되어있어야 하는 걸로 알고 있는데 처음에만 그렇고 두번째는 그전까지만 들어가 있어요..
"inputFunc함수 실행" 까지 들어가져야 하는 걸루 알고있는데 안되서 그럼니다...
위에 이건 무슨말씀이신지 ???
클라이언트가 두번째로 접속( Client가 connect() ) 성공한 후에 inputFunction 을 타게 되는데 .....
내 자식들도 나처럼 !!
댓글 달기