온라인 리붓

2007.04.12 13:09

그리움 조회 수:287 추천:58

-온라인 리붓이란. 사용자들이 접속되어 있는 상태를
유지하면서 리붓이 가능한 기능이다.
온라인 리붓을 하면 머드가 종료되지 않으니
사용자 측면에서는 더없이 좋은 기능이다.
아래 글은 INS에서 퍼온 글이다. -

제 목 : [기능] 온라인리붓 - (CopyOver) - 찬성 : 0 반대 : 0
올린이 : liongo (김성우 ) 읽음 : 167 날짜 : 2000/04/18 11:58
-----------------------------------------------------------------------------
안녕하세요..

간만에 온 선물로. 온라인 리붓(CopyOver) 기능을 올립니다..

방금 만들어서 버그가 있을 가능성이 있으니 유의 하시고

문제점이 있다면 메일 주세요...

상용 머드 이외에선 사용할수 있습니다.

사용하시다가 적발될시에 법적 으로 대응하겠습니다..


CopyRight 2000.4.18 Maker: 김성우
int copy_over(ply_ptr,cmnd)
   creature *ply_ptr;
   cmd *cmnd;

{
       int pid,i;
       char file[80],buf[20],buf2[20];
       FILE *fp;

       log_f("온라인 리부팅 시도중 Desc %d Port %d",Waitsock,Port);


       sprintf(buf,"%d",Waitsock);
       sprintf(buf2,"%d",Port);
       sprintf(file,"./User.dat");
       unlink(file);
       fp = fopen(file,"w");

       for(i=0;i < Tablesize;i++)
       {
           if(!Ply[i].ply) continue;
           if(Ply[i].ply->fd < 0) continue;
           fprintf(fp,"%d %s\n",i,Ply[i].ply->name);
       }
       fprintf(fp,"-1 End");
    fclose(fp);

       execl("./kangho","kangho",buf2,buf,(char *) NULL);
           exit(1);
}

이부분은 명령부입니다. 그대로 추가해주세요..
main 함수부분에 들어간 코드부 입니다..

       if(fork()) exit(0); /* go into background */
       close(0); close(1); close(2); //close stdio

이부분은 제거 해주해 주십시요 실행시 백그라운드로 실행되게

하는 부분입니다 제거한후에는 ./mordor & 형식으로 실행하면 됩니다.

sock_init(Port,?) 하는 두부분을 주석으로 막으시고.
////
       Tablesize = getdtablesize();
       if (Tablesize > PMAX){
           Tablesize = PMAX;
           log_f("Tablesize greater than PMAX\n");

       }
/////// //로 묶은 부분 과 똑같이 생긴부분이..
           sock_init 함수부분에 잇씁니다. 제거하세요..


       sprintf(file,"./User.dat");
       if(file_exists(file))
       {
       fp = fopen(file,"r");

       for(i=0;i < Tablesize;i++)
       {
          
           log_f("\nRecover User data");
           fscanf(fp,"%d %s\n",&bd,tempstr);
           if(bd == -1) break;
           accept_re(bd);
           load_ply(tempstr,&ply_ptr);
           Ply[bd].ply = ply_ptr;
           free_crt(Ply[bd].ply);
           FD_SET(bd,&Sockets);
           if(load_ply(tempstr,&Ply[bd].ply) < 0) continue;
           Ply[bd].ply->fd = bd;
           init_ply(Ply[bd].ply);
           init_alias(Ply[bd].ply);
           Ply[bd].io->encstr = 0;
       }
       Waitsock = atoi(argv[2]);
       FD_SET(Waitsock,&Sockets);
       fclose(fp);
       }
       else
       {
           sock_init(Port,0);
       }
       unlink(file);

이부분은 main.c 입니다.



중요한것...

int Port,int Waitsock,fd_set Sockets 를 전역으로 선언해주세요..
기존에 선언된것들은 제거하세요...

따로 간단한 해더로 만드셔서 선언해둬 됩니당.

하나가 더있습니다.

void accept_re(int fd)
{
       int len, i=1, pid;
       iobuf *io;
       extra *extr;
       struct linger ling;
       struct sockaddr_in addr;
       char *inetname(), path[127],
                               port1str[10], port2str[10];

       addr.sin_family = AF_INET;
       addr.sin_port = htons(Port);
       addr.sin_addr.s_addr = INADDR_ANY;

       len = sizeof(struct sockaddr_in);
    
       if (fd < 0)
               printf("Error");


       io = (iobuf *)malloc(sizeof(iobuf)+128);
       extr = (extra *)malloc(sizeof(extra)+128);
       if(!io || !extr)
               merror("accept_connect", FATAL);

       Ply[fd].io = io;
       Ply[fd].ply = 0;
       Ply[fd].extr = extr;

       zero(extr, sizeof(extra));
       zero(io, sizeof(iobuf));
       io->ltime = time(0);
       io->intrpt = 1;

      
}

그럼 대충 된듯...

안고친 부분이 있는데 고대로 쓰시면요...

리붓후에 사용자들 접속지주소가 사라질껍니다 아마도..? 맞나 체크 안해봤음..

그건 파일 저장할때 주소도 같이 넣고 로딩할때 다시 넣어주면 됩니다..

어렵지 않겟죠?

그럼.......

- 히네시스 -


XE Login