오랜만에 포스팅.. Killing Floor 서버용 툴

흠흠..

최근 킬플 데디 서버를 돌려보면서 서버에 옵션 limit때문에 맵이 변환 될 때 마다 옵션 설정을 다시 해줘야 하는 귀찮음이 너무 심해

자동 수정용 tool한번 만들어 보았다.

기본 원리는 간단하다.

데디서버의 콘솔의 핸들을 얻어와서 입력부의 핸들 다시 한번 얻어서 그쪽으로 메시지 날려주면 되는거다..

http://cs441.ivyro.net/KFOptionChanger.exe

다들 받아서 함 테스트 해보시길.. ㅎㅎㅎ 허접하나 한건 했다..

거두절미하고 중요한 부분은 바로

HWND GetServerHandle()
{
 HWND hWnd = ::FindWindow(_T("KillingFloorUnrealWLog"),NULL);//데디콘솔 핸들얻기
 if(hWnd)
    {
        HWND TestWndChild_0 = ::FindWindowEx(hWnd, NULL, _T("KillingFloorUnrealWEditTerminal"), NULL);//입력창 핸들 얻기
     return TestWndChild_0;
    }
 return hWnd;
}

요거..

spy++를 이용하여 각각의 클래스명을 알아봤다는거..

역시 VC 오랜만에 하니 머리 쥐난다.. ㅠ.ㅠ

쓸데없이 파일 입출력에 시간 보낸것이 젤로 안타까운..

Timer를 사용했는데 보니까 처리 해주는 부분 (옵션 변경 명령어 타자치는 부분)에 처리 완료 될 때 까지 윈도우 행나길래

쓰레드 돌리느라 또 한 한시간 삽질했다능..

너무 달라 너무 허허 ㅠ.ㅠ

실행화면



Add Command를 하면 주욱 커맨드를 순서대로 콘솔에 넣어준다능..

Timer Duration은 전체 command입력 반복주기..

전체 command 갯수*6보다 작으면 command갯수*6초가 기본 반복주기가 된다..

나름 잼있었음..

by LinerX | 2009/06/18 07:18 | 트랙백 | 덧글(0)

기왕 올린거 하나 더~~

이건.. SE 우리의 씨에르사마를 위해 짠거.. 메인부분.. 음.. 좀 구조가 거지같지만 뭐.. 실제 코딩은 한 40시간 정도 삽질은 5일 정도 한 듯 하군.. ㅋ..

int main (int argc,char *argv[])
{
 pthread_t cam_thread;
 pthread_t sensor_thread;
 int t_id;
 
 int listenfd,maxfd;
 int i = 0,nready;
 int port = 2112;
 
 struct sockaddr_in cliaddr;
 int client_len,connfd,sockfd;
 
 /* Sets of file descriptors for I/O multiplexing */
 fd_set rset, allset;
 listenfd = makeListenSock(port);
 
 /*if(argc != 2)
 {
  printf("usage: %s port\n", argv[0]);
  exit(1);
 }
 port = atoi(argv[1]);
 */
 
 
 /*Create Cam Server Thread*/
 t_id = pthread_create(&cam_thread, NULL, camServerMain, NULL);
 
 if (t_id < 0)
 {
  perror("thread create error : ");
  exit(0);
 }
 /*Connect to Cam Server */
 camfd = makeConnect(2113);
 printf("camfd %d\n",camfd);
 
 /*Create Sensor Server Thread*/
 
 t_id = pthread_create(&sensor_thread, NULL, sensorServerMain, NULL);
 if (t_id < 0)
 {
  perror("thread create error : ");
  exit(0);
 }
 
 sensorfd = makeConnect(2114);
 printf("sensorfd %d\n",sensorfd);
 
 
 /*Client Socket List Initialize */
 for( i=0; i<FD_SETSIZE; i++)
  client[i] = -1;
 
 printf("서버소켓 %d\n",listenfd);
 maxfd = listenfd;//초기화
 maxi = 1;
 FD_ZERO(&allset);
 FD_SET(camfd, &allset);
 FD_SET(sensorfd, &allset);
//ㅎㅎ 역시 잼있게 짠 것은.. 서버 소켓 3개 켜놓고.. 하나 셋에 집어 넣고 한 저 집념.. ㅋㅋㅋ 
// 이상하게 Centralize한게 좋다고나 할까.. 허허.. 
 FD_SET(listenfd, &allset);//fd set에 listen sock 입력
 client[0] = camfd;
 client[1] = sensorfd;
 if(camfd>maxfd);
  maxfd = camfd;
 if(sensorfd>maxfd);
  maxfd = sensorfd;
 while(1)
 {
  rset = allset; /* structure assignment */
  nready = select(maxfd+1, &rset,NULL,NULL,NULL);
  if(FD_ISSET(listenfd, &rset))
  { 
   /* new main_client connection */
   client_len = sizeof(cliaddr);
   connfd = accept(listenfd,(struct sockaddr *)&cliaddr, &client_len);
   printf("connected sockfd = %d\n", connfd);
   for (i=0; i<FD_SETSIZE; i++)
   {
    if (client[i] < 0)
    {
     client[i] = connfd; /* save descriptor */
     break;
    }
   }

   if(i == FD_SETSIZE)
   { 
    printf("Too many peers");
    exit(1);
   }
   
   FD_SET(connfd, &allset); /* add new descriptor to set */
   
   if (connfd > maxfd)
    maxfd = connfd; /* for select */
   
   if (i > maxi)
    maxi = i; /* max index in client[] array */
   
   if (--nready <= 0)
    continue; /* no more readable descriptors */
  }
  /*if(toltime!=-1)
  {
   if(toltime == 30)
   {
    char* sendData;
    toltime = -1;
    sendData = makeBytePacket(PARENTPACKET_TAG,-1,saveSIG,-1,NULL,0);
    sendMsg(sensorfd,sendData,sizeof(int)*5);
    free(sendData);
   }
   printf("toltime = %d",toltime);
   toltime++;
  }*/
  for(i=0;i<=maxi; i++)
  { /* check all clients for data */
   if((sockfd=client[i]) < 0)
    continue;
   if(FD_ISSET(sockfd, &rset))
   {
    int size = 0, n;
    char *buf = NULL;
    if((n=readMsg(sockfd,&size,sizeof(size)))==0)
    {
    /* connection closed by client */
     close(sockfd);
     FD_CLR(sockfd, &allset);
     client[i] = -1;
     printf("Connection lost from = %d\n", sockfd);
    }else if( n == sizeof(int))
    {
     /* Read more data from a camera or a camera viewer socket*/
     size = ntohl(size);
     //printf("Main received packet size = %d\n", size);
     buf = (char *)malloc(size);
     readMsg(sockfd, buf, size);
     packetProcessForClient(sockfd, buf, size);
     free(buf);
    }
   
    if (--nready <= 0){
     break; /* no more readable descriptors */
    }
   }
  }
 }
}
// 아 설명이 귀찮음으로 주석 생략.. 옆에 붙은 영어 주석은 허허.. 원래 스켈레톤에 있던거구나

by LinerX | 2008/12/02 04:24 | Network | 트랙백 | 덧글(0)

ㅎㅎ 말만 해놓고 너무 한게 없어서... 한 번..

흠..
C/C++에 넣어야 할지 네트워크에 넣어야 할지 허허..

학교 system programming 과정에서 했 던 소스 코드를 한번 풀어 볼까 하옵나이다..

허접하오나 양해를 ㅋㅋ

일단 생각해본 메인 함수..

int main(int argc,char *argv[])
{
 int listen_fd; //  리슨하는 소켓이네..
 int *conn_fd; // 커넥션 소켓인데.. 왜 포인터 썼지? 허허.. 기억이 안나네.. 쓰레드에 변수 넘길라고 했나? 허허..
 
 struct sockaddr_in server_addr;//뭐 서버용 주소 넣는 곳
 struct sockaddr_in client_addr;// 클라용
 
 pthread_t tid; // 쓰레드 생성용
 int port; // 포트번호
 int sock_opt = 1; // 소켓 옵션 저장용
 
/*여기서 부터는 이제 아규먼트 제대로 받았는지 확인..
 if(argc==2) {
  port = atoi(argv[1]);
 } else {
  printf("usage: %s [port #]\n",argv[0]);
  return 1;
 }
 // 여기는 일단 리슨용 소켓 생성
 listen_fd = socket(AF_INET, SOCK_STREAM, 0);

 if(listen_fd < 0) {
  perror("socket");
  return 1;
 }
//여기서 소켓 옵션 설정

 setsockopt(listen_fd,SOL_SOCKET,SO_REUSEADDR,(char *)&sock_opt,sizeof(sock_opt));

 memset(&server_addr,0,sizeof(server_addr));//메모리에 잡아주시고
//나머지 값들 설정
 server_addr.sin_family = PF_INET;
 server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
 server_addr.sin_port = htons(port);
 //바인드 걸어 주고
 if(bind(listen_fd,(struct sockaddr *)&server_addr,sizeof(server_addr))) {
  perror("bind");
  return 1;
 }
//리슨 시작 궈궈

 if(listen(listen_fd,BACKLOG)) {
  perror("listen");
  return 1;
 }
//그리고 무한 반복 돌아 주시겠다

 for(;;) {
  int addr_len = sizeof(client_addr);//클라이언트놈 초기화 해줄라면 일단 크기좀 알아 놓고
  conn_fd = malloc(sizeof(int));// 그만큼 메모리 잡아 주시고
  *conn_fd = accept(listen_fd, (struct sockaddr *)&client_addr, (socklen_t *)&addr_len);//여기는 접속 들어 오실 때 까지 기다려 주시니까.. 접속 오시면 받아다가 fd값 저장해주신단다..
  printf("accept\n");// 받았음 출력..
  pthread_create(&tid, NULL,HTTP_process, conn_fd);// 이제 쓰레드 생성 여기서 중요한게 fd의 좀 효율적인 제어를 위해서 conn_fd값을 넘겨주었음.. 허나.. 별로 맘에 안든다..
// 실제로 select를 사용하여 하려고 했지만 허허.. 귀차늬즘..
  /*if((child_pid = fork())==0){ //child process 아 요기 주석 처리된 라인은 예전에 다중 프로세스로 만들었 던 거군요..
   close(listen_fd);
   HTTP_process(conn_fd);
   exit(0);
  }*/
 }
}

by LinerX | 2008/12/02 02:52 | Network | 트랙백 | 덧글(0)

음.. 계속적인 프로그래밍 공부를 위해서.. !!! IOCP서버 만들기.

매우 간단한 형테의 IOCP 서버를 만들어 보려고 시도중입니다...

어려워 어려워..

카피& 페이스트 만이 살 길인것인가.. 두둥..

일단 기본 모듈몇개 부터 라이브러리로 만들어 놓고 시작해볼까나..

온라인 게임 서버 프로그래밍 이라는 책이 있길래..

카드게임 서버와 클라이언트를 한번 제작해보려고 시도중인데.. ㅎㅎㅎ 역시 어렵네..

허접한 코딩스킬은 역시나 허허..

그래도 일단 시작..

by LinerX | 2008/10/16 20:51 | Network | 트랙백 | 덧글(1)

이번학기는 휴학..

가슴 아픈 일이로다..

건강상의 문제로 휴학 결정,.. 앞으로 갈길에 대한 걱정이 살짝 되고 있긴 하지만서도..

이번기회에 하고싶었던 것들을 싹 해주겠음...

건강관리. 아이디어 구상. 프로그래밍 틈틈히. 사업계획서. 진로 계획좀 더..

by LinerX | 2008/10/01 03:46 | Life is.. | 트랙백 | 덧글(0)

◀ 이전 페이지          다음 페이지 ▶