▷ 메인부
#include "BaseBallServer.h" // 헤더파일인클루드
int main(){
ReadyBaseBall(); // 소켓생성및연결
PlayBaseBall(); // 야구게임시작
}
▷ 헤더부
#ifndef _BASEBALLSERVER_H_ // 재정의오류방지
#define _BASEBALLSERVER_H_
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <WinSock2.h>
#define PORT 2600 // 포트번호
int ReadyBaseBall(); // 소켓연결
void PlayBaseBall(); // 야구게임
#endif
▷ 구현부
#include "BaseBallServer.h" // 헤더파일
WSADATA wsdata // 소켓함수전역변수선언
SOCKET serverSocket, clientSocket
struct sockaddr_in serverAddress
int ReadyBaseBall(){ // 소켓연결부분
if(WSAStartup(MAKEWORD(2,2), &wsdata) != 0){ // 소켓을초기화한다
printf("fail initiallize socket\n");
return 0;
}
printf("initiallize socket\n");
serverSocket = socket(AF_INET, SOCK_STREAM, 0); // 소켓연결을생성한다
if(serverSocket == INVALID_SOCKET){
printf("Fail Make socket\n");
return 0;
}
printf("Make Scoket\n");
ZeroMemory(&serverAddress, sizeof(serverAddress)); // 연결요청을받을수있도록소켓의옵션을설정
serverAddress.sin_addr.s_addr = htonl(INADDR_ANY);
serverAddress.sin_family = AF_INET
serverAddress.sin_port = htons(PORT);
bind(serverSocket, (struct sockaddr *)&serverAddress, sizeof(serverAddress));
listen(serverSocket, 5); // 연결을기다린다
printf("Waiting client access....\n");
clientSocket = accept(serverSocket, NULL, NULL); // 연결이오면수락
printf("client is on the net\n");
printf("Play~~~~Ball~~~~!!!\n");
}
void PlayBaseBall(){ // 야구게임
int serverNum[3]; // 생성된숫자가저장될변수
int fromClientNum[3]; // 클라이언트로부터받거나서버가입력하는수
int toClientScore[3]; // 볼카운트저장S.B.O
int index, i, j // 반복문위한변수
int strike, ball, out // 볼카운트저장
int tmpservernum, tmpclientnum // 볼카운트때쓸변수
strike = ball = out = 0; // 볼카운트초기화
srand((unsigned)time(NULL)); // 매번다른랜덤수가나오게하기위해
do{
serverNum[0] = rand()%10; // 랜덤한정수를0~9 범위내에서생성
serverNum[1] = rand()%10;
serverNum[2] = rand()%10;
// 세개의숫자가다른수가나올때까지반복
}while((serverNum[0] == serverNum[1] || serverNum[0] == serverNum[2] || serverNum[1] == serverNum[2]));
//테스트의편이성위해정답을서버에선알도록한다
printf("Make Number is..... %d %d %d\n", serverNum[0], serverNum[1], serverNum[2]);
while(1){ // 본게임
printf("Now client turn\n"); // 클라이언트가선을잡는다
// 클라이언트에서입력한숫자들을받아온다
recv(clientSocket, (char*)fromClientNum, sizeof(fromClientNum), 0);
for(index=0; index < 3; index++){ // 네트워크바이트를호스트바이트로변환
fromClientNum[index] = ntohl(fromClientNum[index]);
}
// 클라이언트가입력한숫자를출력
printf("Client Input : %d %d %d\n", fromClientNum[0], fromClientNum[1], fromClientNum[2]);
for(i = 0; i < 3; i++){ // 볼카운트를센다
tmpservernum = serverNum[i];
for(j=0; j < 3; j++){
tmpclientnum = fromClientNum[j];
if(tmpservernum == tmpclientnum){
if(i==j){ // 숫자와자릿수가일치하면스트라이크
strike++;
}
else{ // 숫자만맞으면볼
ball++;
}
}
}
}
out = 3-(strike+ball); // 아웃은3-스트라이크+볼
// 볼카운트를출력한다
printf("[Client] -> S : %d B : %d O : %d\n", strike, ball, out);
toClientScore[0] = htonl(strike); // 호스트의바이트를네트워크바이트로변환
toClientScore[1] = htonl(ball);
toClientScore[2] = htonl(out);
// 클라이언트에볼카운트결과를전송한다
send(clientSocket, (char*)toClientScore, sizeof(toClientScore), 0);
if(strike == 3){ // 3스트라이크면게임종료
printf("client win~!!\n");
printf("End~~Ball~~!!\n");
closesocket(clientSocket);
return ;
}
else{
strike = ball = out = 0;
}
// 정답공개
printf("Make Number is..... %d %d %d\n", serverNum[0], serverNum[1], serverNum[2]);
printf("Now Server Turn\n"); // 서버의턴이돌아옴
do{
// 서버측에서숫자를입력
printf("Input : ");
scanf_s("%d %d %d", &fromClientNum[0], &fromClientNum[1], &fromClientNum[2]);
}// 같은수의입력과0-9 범위를벗어나는입력을예외처리한다
while(fromClientNum[0] == fromClientNum[1] || fromClientNum[0] == fromClientNum[2] || fromClientNum[1] ==fromClientNum[2] ||
fromClientNum[0] < 0 || fromClientNum[0] > 9 || fromClientNum[1] < 0 || fromClientNum[1] > 9 || fromClientNum[2] < 0 || fromClientNum[2] > 9);
//서버가입력한숫자를출력한다
printf("Server Input : %d %d %d\n", fromClientNum[0], fromClientNum[1], fromClientNum[2]);
for(i = 0; i < 3; i++){// 볼카운트
tmpservernum = serverNum[i];
for(j=0; j < 3; j++){
tmpclientnum = fromClientNum[j];
if(tmpservernum == tmpclientnum){
if(i==j){
strike++;
}
else{
ball++;
}
}
}
}
out = 3-(strike+ball);
for(i = 0; i<3; i++){ // 호스트바이트-> 네트워크바이트
fromClientNum[i] = htonl(fromClientNum[i]);
}
// 서버입력숫자를전송
send(clientSocket, (char*)fromClientNum, sizeof(fromClientNum), 0);
// 볼카운트결과를전송
printf("[Server] - > S : %d B : %d O : %d\n", strike, ball, out);
toClientScore[0] = htonl(strike);
toClientScore[1] = htonl(ball);
toClientScore[2] = htonl(out);
send(clientSocket, (char*)toClientScore, sizeof(toClientScore), 0);
if(strike == 3){ // 3스트라이크면서버측승리
printf("server win!!\n");
printf("End~~Ball~~!!\n");
closesocket(clientSocket);
return ;
}
else{ // 아닐경우초기화하고클라리언트턴
strike = ball = out = 0;
}
}
}
'과제모음' 카테고리의 다른 글
2010년 컴프2 Test레포트 (0) | 2010.01.22 |
---|---|
네트워크 숫자야구(Client) (0) | 2010.01.22 |
Thread이용한 다중채팅(Client) (0) | 2010.01.22 |
Thread를 이용한 다중채팅(Server) (0) | 2010.01.22 |
Select함수를 이용한 1:1 채팅(Client) (0) | 2010.01.22 |