Computer(IT)/Visual Studio C++

MFC 서버 초기화모듈과 서버소스

약탄치킨 2008. 10. 11. 02:51
반응형


ServSendController.cpp
//===========================================================
#include "stdafx.h"
#include "ServSendController.h"
#include <stdio.h>
#include <stdlib.h>
#include <mmsystem.h>


PLAYER player_self, player_2;

int isThread;

WSADATA  wsa;
SOCKET   sock;
SOCKADDR_IN serveraddr;


void StartWinSock();

int recvn(SOCKET s, char *buf, int len, int flags);
void sendToServer(char *message); //서버에 메세지전송
int my_strcmp(const char*, const char *);
int my_strncmp(const char *, const char *, size_t);

 

void err_quit(char *msg);
void err_display(char *msg);
void ErrorHandling(LPCSTR message);
//void StartWinSock();

DWORD WINAPI ThreadFunction(void *arg);
/*
void Position_Receiver()

 float tPositionX=0,tPositionY=0;
// tPositionX=FaceController.player_self.ptx;
// tPositionY=FaceController.player_self.pty;

 player_self.ptx = tPositionX;
 player_self.pty = tPositionY;

 printf("ptx : %f pty : %f",player_self.ptx,player_self.pty);
}
*/
/*ServSendController::~ServSendController()

// AllocConsole();
// freopen("CONOUT$","w",stdout);
}
*/
/*
//char title_str[100]; //자기자신의 정보
//char title_str2[100]; // 상대편의 정보
int recvn(SOCKET s, char *buf, int len, int flags);
void sendToServer(char *message); //서버에 메세지전송
int my_strcmp(const char*, const char *);
int my_strncmp(const char *, const char *, size_t);
int isThread;
void err_quit(char *msg);
void err_display(char *msg);
void ErrorHandling(LPCSTR message);
//PLAYER player_self, player_2;
//DWORD WINAPI ThreadFunction(void *arg);

*/

void err_quit(char *msg)
{
 LPVOID lpMsgBuf;
 FormatMessage(
  FORMAT_MESSAGE_ALLOCATE_BUFFER|
  FORMAT_MESSAGE_FROM_SYSTEM,
  NULL, WSAGetLastError(),
  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  (LPTSTR)&lpMsgBuf, 0, NULL);
 MessageBox(NULL, (LPCTSTR)lpMsgBuf, msg, MB_ICONERROR);
 LocalFree(lpMsgBuf);
 exit(-1);
}

// 소켓 함수 오류 출력
void err_display(char *msg)
{
 LPVOID lpMsgBuf;
 FormatMessage(
  FORMAT_MESSAGE_ALLOCATE_BUFFER|
  FORMAT_MESSAGE_FROM_SYSTEM,
  NULL, WSAGetLastError(),
  MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
  (LPTSTR)&lpMsgBuf, 0, NULL);
 printf("[%s] %s", msg, (LPCTSTR)lpMsgBuf);
 LocalFree(lpMsgBuf);
}
/*

 

*/

//void StartWinSock()
void StartWinSock()
{
 
 int retval;
 // 윈속 초기화
 //WSADATA wsa;
 if(WSAStartup(MAKEWORD(2,2), &wsa) != 0)
  printf(" Break!!!!!!\n");
 //  return -1;

 // socket()
 sock = socket(AF_INET, SOCK_STREAM, 0);
 if(sock == INVALID_SOCKET) err_quit("socket()"); 

 // connect()
 //SOCKADDR_IN serveraddr;
 ZeroMemory(&serveraddr, sizeof(serveraddr));
 serveraddr.sin_family = AF_INET;
 serveraddr.sin_port = htons(9000);
 serveraddr.sin_addr.s_addr = inet_addr("210.107.236.99");
 retval = connect(sock, (SOCKADDR *)&serveraddr, sizeof(serveraddr));
 if(retval == SOCKET_ERROR) ErrorHandling("connect() error!");
 // 데이터 통신에 사용할 변수

 //sendToServer("서버 접속!!\0");//서버로 메세지전송

 

 //#######################################################################START
 //쓰레드생성
 if(isThread==0){
  HANDLE hThread=0;
  DWORD dwThreadID;
  DWORD dw;
  hThread = CreateThread(NULL, 0, ThreadFunction, NULL, 0, 0);
  if(hThread == 0){
   exit(1);
  }
 } 
}


void ErrorHandling(LPCSTR message)
{
 fputs(message, stderr);
 fputc('\n', stderr);
 exit(1);
}

// 사용자 정의 데이터 수신 함수
int recvn(SOCKET s, char *buf, int len, int flags)
{
 int received;
 char *ptr = buf;
 int left = len;

 while(left > 0){
  received = recv(s, ptr, left, flags);
  if(received == SOCKET_ERROR)
   return SOCKET_ERROR;
  else if(received == 0)
   break;
  left -= received;
  ptr += received;
 }

 return (len - left);
}

int my_strcmp(const char *s1, const char *s2)
{
 unsigned char *ps1, *ps2;

 ps1 = (unsigned char *)s1;
 ps2 = (unsigned char *)s2;
 for(;;)
 {
  if( (*ps1) != (*ps2))
  {
   if( (*ps1) > (*ps2) )
   {
    return 1;
   }
   else
   {
    return -1;
   }
  }
  if( (*ps1) == 0)
  {
   return 0;
  }
  *ps1++;
  *ps2++;
 }
}
void sendToServer(char *message)
{
 char mesg[100];
 ZeroMemory(mesg, sizeof(mesg));
 strcpy(mesg, message);
 send(sock, mesg, strlen(mesg), 0); //메세지전송

}


int my_strncmp(const char *s1, const char *s2, size_t n)
{
 unsigned char *ps1, *ps2;
 int i;
 ps1 = (unsigned char *)s1;
 ps2 = (unsigned char *)s2;

 for(i = 0 ; i<=n ; i++)
 {
  if( (*ps1) != (*ps2) )
  {
   if( (*ps1) > (*ps2) )
   {
    return 1;
   }
   else
   {
    return -1;
   }
  }
  if( (*ps1) == 0)
  {
   return 0;
  }
  *ps1++;
  *ps2++;
 }
 return 0;
}

DWORD WINAPI ThreadFunction(void *arg) //쓰레드 함수
{  // 상대방 정보수신
// int testcount=0; //Check recv

 isThread=1;//쓰레드가 존재한다는 표시

 int retval=0;

 while(1){
  Sleep(200);
  retval = recv(sock,(char*)&player_2, sizeof(PLAYER), 0);
  //  if(retval == 0 )
  //   strcpy(cTempArray,"종료");
//  testcount++;
//  printf("%d",testcount);
 }

 return 0;
}
//#########################################################################END
/*
void title(char *message)
{
printf("%s\n", message);
//SetWindowText(hWnd, message);//테스트
}

*/


//===========================================================


ServSendController.h
//===========================================================
#ifndef SERVSENDCONTROLLER_H
#define SERVSENDCONTROLLER_H


#include <windef.h>
#include <winnt.h>
#include <winbase.h>
#include <wingdi.h>
#include <winsock2.h>


struct PLAYER{
 float ptx;
 float pty;

 float pbx;
 float pby;
 float pbz;

 float psx;
 float psy;
 float psz;

 int count;
 int nID;
};
extern PLAYER player_self, player_2;


extern int isThread;

extern WSADATA  wsa;
extern SOCKET   sock;
extern SOCKADDR_IN serveraddr;


void StartWinSock();

#endif

//===========================================================