디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

일대일 채팅 누가 물어봤지?

로또로(218.39) 2012.01.25 21:30:00
조회 208 추천 0 댓글 0


// SocketClient.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//

 

#include "stdafx.h"
#include "winsock.h"
#include <process.h>

#define MAXBUF 60
#define MAXLINE 15
#define PORT 9000
#define IPADDR "127.0.0.1"  // server IP

CRITICAL_SECTION hCriticalSection;   // 동기화 도구 - 크리티컬 섹션 변수

int curLine = 0;       // dialog 배열의 현재 위치
char dialog[MAXLINE][MAXBUF+1+12] = {0, }; // 대화내용 저장
bool isDisconnected = false;    // 연결이 끊어졌는지 체크
char bufBlank[MAXBUF+1+12];     // 콘솔창에서 1라인을 지우기 위한 공백텍스트임

void show_dialog();       // 대화내용을 보여주는 변수
unsigned int WINAPI RecvThreadProc(LPVOID lpParam);
unsigned int WINAPI SendThreadProc(LPVOID lpParam);

 

int main()
{
 SOCKET c_socket;
 struct sockaddr_in client_addr;
 WORD wVersionRequested;
 WSADATA wsaData;
 int err;
 char addr[] = "000.000.000.000";

 DWORD dwRecvThreadId, dwSendThreadId;
 HANDLE hRecvThread, hSendThread;

 InitializeCriticalSection(&hCriticalSection);  // 동기화 도구 초기화 함.

 memset(dialog, 0, sizeof(dialog));
 memset(bufBlank, (int)' ', sizeof(bufBlank));  // space로 채운다. 화면을 지우기 위한것.
 bufBlank[ sizeof(bufBlank)-1 ] = '\0';

 // before use socket, must do startup! 소켓 초기화
 wVersionRequested=MAKEWORD(2,2);
 err = WSAStartup(wVersionRequested, &wsaData);

 [...];  // 전체 화면 지우기


 // 연결할 서버 주소를 입력 받는다.
 printf("\n\n * Input IP address : ");
 fflush(stdin);
 scanf_s("%s", addr, sizeof(addr));

 c_socket = socket(PF_INET, SOCK_STREAM,0);  // 소켓 생성


 memset(&client_addr, 0, sizeof(client_addr)); // 주소 구조체 셋팅
 client_addr.sin_addr.s_addr = inet_addr(addr);
 client_addr.sin_family = AF_INET;
 client_addr.sin_port = htons(PORT);

 // connect, 연결함
 if(connect(c_socket, (struct  sockaddr *) &client_addr, sizeof(client_addr)) == -1)
 {
  printf("Can not connect\n");
  closesocket(c_socket);
  return -1;
 }

 printf("\n * Connected ...\n");

 Sleep(1000);

 [...];

 isDisconnected = false;

 // 서버로 부터 데이터를 기다리는 쓰레드 생성
 hRecvThread = (HANDLE)_beginthreadex(NULL, 0, RecvThreadProc, (void*)c_socket, CREATE_SUSPENDED, (unsigned*)&dwRecvThreadId);

 // 서버로 데이터를 보내는 쓰레드 생성
 hSendThread = (HANDLE)_beginthreadex(NULL, 0, SendThreadProc, (void*)c_socket, CREATE_SUSPENDED, (unsigned*)&dwSendThreadId);

 ResumeThread(hRecvThread);  // 쓰레드 시작
 ResumeThread(hSendThread);  // 쓰레드 시작
 WaitForSingleObject(hRecvThread, INFINITE);  // 쓰레드가 종료될때까지 대기
 WaitForSingleObject(hSendThread, INFINITE);  // 쓰레드가 종료될때까지 대기

 // disconnect,  두 쓰레드가 모두 종료되면, 소켓을 닫음.
 closesocket(c_socket);  

 // 동기화 도구 해제
 DeleteCriticalSection(&hCriticalSection);

 return 0;
}

 

 

// 콘솔에서 대화 내용등을 보여주는 일을 함
void show_dialog()
{
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 윈도우 핸들 얻기

 DWORD  dw;
 COORD  Coor;
 int i=0, line = 0;

 Coor.X=1;
 for(i=0; i<MAXLINE; i++) // 대화내용을 콘솔의 아래쪽부터 한줄씩 위로 표시함
 {
  // set position. 위치 설정
  Coor.Y = MAXLINE - i;
  line = (curLine + MAXLINE - i) % MAXLINE;

  // 먼저 기존의 대화 내용을 지우고,
  WriteConsoleOutputCharacterA(hOut,bufBlank,strlen(bufBlank),Coor,&dw);

  // 대화내용을 표시해줌
  WriteConsoleOutputCharacterA(hOut,dialog[line],strlen(dialog[line]),Coor,&dw);
 }

 if(isDisconnected) // 연결이 끊어졌을때,
 {
  char disc[] = "* Disconnected.. Press Enter key.. ";
  Coor.X = 1;
  Coor.Y = MAXLINE + 1;
  WriteConsoleOutputCharacterA(hOut,disc,strlen(disc),Coor,&dw);
 }
}


// 수신 쓰레드
unsigned int WINAPI RecvThreadProc(LPVOID lpParam)
{
 SOCKET c_socket = (SOCKET)lpParam;
 int n;
 char rcvBuffer[MAXBUF+1] = {0, };

 // receive data from server
 while(1)
 {
  // 먼저 연결이 끊어 졌는지 체크, isDisconnected 가 TRUE 이면 내가 접속을 끊은것이고,
  // recv 리턴값이 0 이면 상대방이 접속을 끊은것이다. 0보다 작으면 다른 에러 발생으로 종료된것
  if(isDisconnected || (n = recv(c_socket, rcvBuffer,sizeof(rcvBuffer), 0)) <= 0)
  {
   closesocket(c_socket); // 소켓을 닫고

   if(isDisconnected == true)
   {
    return 0;
   }
   isDisconnected = true;

   EnterCriticalSection(&hCriticalSection);
   show_dialog();
   LeaveCriticalSection(&hCriticalSection);
   return (-1);
  }
  rcvBuffer[n] = '\0';

  // 수신된 내용을 대화내용 저장 배열에 카피하고 표시함.
  EnterCriticalSection(&hCriticalSection);
  memset(dialog[curLine], 0, sizeof(dialog[curLine]));
  strcpy(dialog[curLine], "Remote : ");
  strcat(dialog[curLine], rcvBuffer);
  show_dialog();

  curLine = (curLine + 1) % MAXLINE;
  LeaveCriticalSection(&hCriticalSection);
 };

 return 0;
}

// 발신 쓰레드
unsigned int WINAPI SendThreadProc(LPVOID lpParam)
{
 SOCKET c_socket = (SOCKET)lpParam;
 int n;
 char sendBuffer[MAXBUF+1] = {0, };
 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
 DWORD  dw;
 COORD cdPos = { 0, MAXLINE + 3 };
 COORD cdPos2 = { 0, MAXLINE + 4};

 // send chat text
 while(1)
 {
  memset(sendBuffer, 0, sizeof(sendBuffer));

  // 기존의 사용자 입력 내용을 삭제하고,
  WriteConsoleOutputCharacterA(hOut,bufBlank,strlen(bufBlank),cdPos2,&dw);

  // scanf 입력 받은 후 콘솔이 아래로 내려 가지 않도록 위치를 고정시킴
  SetConsoleCursorPosition(hOut, cdPos);

  if(isDisconnected)
  {
   closesocket(c_socket);
   return 0;
  }

  // 슬래쉬 exit는 연결 종료 명령어임
  printf("/exit : disconnect\n");
  printf("Send : ");

  // 대화내용을 입력받음. fflush(stdin)를 입력 버퍼를 비움
  fflush(stdin);
  scanf_s("%[^\n]", sendBuffer, MAXBUF);

  n = strlen(sendBuffer);

  // 입력하는동안 접속이 끊겻다면 소켓을 닫고, 리턴
  if(isDisconnected)
  {
   closesocket(c_socket);
   return 0;
  }

  // 그냥 엔터를 쳣거나 하면 무시
  if(n <= 0)
   continue;

  // 종료 명령어를 입력 했는지 체크
  if(strcmp(sendBuffer, "/exit") == 0)
  {
   closesocket(c_socket);
   isDisconnected = true;
   return 0;
  }

  // 상대편으로데 메시지를 전송
  send(c_socket, sendBuffer,n, 0);

  // 메시지를 대화내용에 저장하고 표시
  EnterCriticalSection(&hCriticalSection);
  memset(dialog[curLine], 0, sizeof(dialog[curLine]));
  strcpy(dialog[curLine], "Local : ");
  strcat(dialog[curLine], sendBuffer);
  show_dialog();

  curLine = (curLine + 1) % MAXLINE;
  LeaveCriticalSection(&hCriticalSection);


 };

 return 0;
}

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 대박 날 것 같아서 내 꿈에 나와줬으면 하는 스타는? 운영자 25/11/17 - -
AD 대학생 필수템! What's in my Bag 운영자 25/11/21 - -
300222 형들,, Show me What You got [2] 흑랩(220.149) 12.01.26 56 0
300221 내가 여친 사귀면 하고싶었던 list.txt [3] Stan(220.244) 12.01.26 393 0
300219 안드로이드 게임 개발? [1] sayhaha(50.53) 12.01.26 83 0
300218 winapi는 김상형씨꺼가 甲? [1] 1(211.197) 12.01.26 201 0
300216 심심풀이 로또 분석 예전에 짜둔 것은 날아갔음. ㅇㅇ [1] ☎v2.0™갤로그로 이동합니다. 12.01.26 93 0
300214 저 지금 레알 밖는 연습중 [6] Stan(220.244) 12.01.26 170 0
300213 횽들 궁금한게 있어요~ 숙제아님 [5] ㅁㄴㅇ(114.200) 12.01.26 88 0
300211 로또로횽한테 던져준거 1시간째 돌리고 있다 [1] dlbo갤로그로 이동합니다. 12.01.26 84 0
300209 형들 저 오늘 여친생김 섹스.txt [14] Stan(220.244) 12.01.26 305 0
300208 윈도우 어플리케이션에서 콘솔좀 쓰려는데 [3] lucy_han갤로그로 이동합니다. 12.01.26 74 0
300207 저녁먹고 나니 배불러서 치킨 생각이 슬슬 사라져간다 [9] dlbo갤로그로 이동합니다. 12.01.26 84 0
300206 아아 막준갤로그로 이동합니다. 12.01.26 39 0
300205 코딩을 하다보면 내 자신도 기계가 되는거 같다 [2] 천재(211.197) 12.01.26 98 0
300204 프갤러들 다모아놓고 공동개발시키면 [11] ㅇㄴㅁ(61.47) 12.01.26 151 0
300203 저기 죄송합니다 혹시 vmware 쓰시는분들중에서 [5] TimeCat갤로그로 이동합니다. 12.01.26 77 0
300202 야 dlbo 인가뭔가 이글봐라 [2] C언어초보(121.157) 12.01.26 79 0
300201 로또로횽 미안혀 다시 받아유 ㅋㅋㅋㅋㅋㅋ [15] dlbo갤로그로 이동합니다. 12.01.26 100 0
300200 형들 좇 뉴비가 또 질문좀 [8] 쒦뚫쉚뚫샒휆뚫뚫쒦갤로그로 이동합니다. 12.01.26 81 0
300199 특정 IP가 특정 네트워크에 있다는 것을 알아내는 로직좀 갈켜주세여 [3] 궁금이(59.13) 12.01.26 95 0
300198 로또로횽 마지막으로 봅니다 - 오오미 미안혀유 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ [4] dlbo갤로그로 이동합니다. 12.01.26 66 0
300197 형들 질문점 [3] 쒦뚫쉚뚫샒휆뚫뚫쒦갤로그로 이동합니다. 12.01.26 57 0
300196 주식/FX/옵션 이런거 프로그램 하는 새끼들은 그래도 그러려니 하겠는데 [6] 시불라미갤로그로 이동합니다. 12.01.26 133 0
300195 로또로횽 아직 안끝났음. [10] dlbo갤로그로 이동합니다. 12.01.26 75 0
300194 지잡대는 뭐하러사냐 [1] 유동(125.142) 12.01.26 87 0
300192 vs2010로 개발할려고 하는데 chart를 쓸려고 합니다.. [1] 초보개발자(210.107) 12.01.26 79 0
300190 이민가고 싶다 1(118.220) 12.01.26 33 0
300189 흠흠 백탈자(61.250) 12.01.26 30 0
300188 로또 떡밥에 참여하고 싶다 [2] [성대아싸]갤로그로 이동합니다. 12.01.26 64 0
300187 로또로 횽은 봅니다 [9] dlbo갤로그로 이동합니다. 12.01.26 85 0
300186 나 c언어 중급 정도 되고 api배우러 갈건데 [1] 1(118.220) 12.01.26 96 0
300185 실시간 음성 스트리밍 서비스에서 서버랑,,, 이것저것 횽들 좀 도와줘!! [6] 흑랩(220.149) 12.01.26 89 0
300183 다이렉트x 공부는 어떻게 함요? [4] 1(118.220) 12.01.26 109 0
300182 c언어하는데 진수변환능력 필수야? [5] ㅁㄴㅇㄹ(61.47) 12.01.26 103 0
300181 시드값 적용 예 [28] 로또로(218.159) 12.01.26 183 0
300180 프갤러들아 소변신호가 오고 물을 마시고 장실가냐 장실갔다온후 물을 마시냐 [3] ㅊㄹ(222.112) 12.01.26 56 0
300178 로또 중복수 뽑는거 프로그램 소스 올림 [5] 로또로(218.159) 12.01.26 192 1
300177 아까 그 컴파일 되는지 안되는지 수정 코드. [2] dlbo갤로그로 이동합니다. 12.01.26 35 0
300176 코레일 공채 공부에 올인 VS 코딩에 올인 [7] dlbo갤로그로 이동합니다. 12.01.26 493 0
300175 조공을 바꿨다 [20] 로또로(218.159) 12.01.26 200 0
300172 에잇 퉤 돈생기면 임베디드치킨 꼭 차린다 [2] dlbo갤로그로 이동합니다. 12.01.26 142 0
300171 야 이거 윈도우에서 컴파일 되냐? [37] ㅓㅏㅣ(210.107) 12.01.26 187 0
300170 C언어 도와주세요 ㅋ [9] ddd(210.107) 12.01.26 150 0
300169 생각해보니 대딸방 어플 만들면 잘나갈듯 dlbo갤로그로 이동합니다. 12.01.26 218 0
300166 아씨 밥먹었는데 배고프다 [2] dlbo갤로그로 이동합니다. 12.01.26 63 0
300165 회의감이 들어요 ㅠ asd(218.237) 12.01.26 64 0
300162 DC겔 리스트에서 프겔 왜 없어졌냐? [2] 개심심(61.73) 12.01.26 82 0
300161 숫자 5개 입력받아서 작은 차례로 정렬하는거 이렇게 만드는거 맞나 [12] ㅁㅁㅈ(61.251) 12.01.26 92 0
300160 [국비무료]자바 안드로이드 HTML5 하이브리드국비지원 안내 wlskrksmswk갤로그로 이동합니다. 12.01.26 94 0
300156 아무리 그래도 아이디어를 달라니.... [3] ㅁㅈ다(116.125) 12.01.26 91 0
300155 이거 풀어주면 아이디어 하나 공급해준다. [24] 로또로(218.159) 12.01.26 174 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2