디시인사이드 갤러리

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

갤러리 본문 영역

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

로또로(218.39) 2012.01.25 21:30:00
조회 210 추천 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/24 - -
AD 대학생 필수템! What's in my Bag 운영자 25/11/21 - -
공지 프로그래밍 갤러리 이용 안내 [97] 운영자 20.09.28 48752 65
2904430 뽐¯뿌' ▵게▫시‥글▹ „써′주‘시¨면´ ‛1·건‵당´ ·1▵-•5‗ _만⫶원‚ º드¯립‗니•다∘.′ ▵불◦법` ‟이;상◃한`거‗ °절◃대„ ·아‵님▵.- „ ᄏㅏㅌᅩᆨ  ⒸⒹ 23 \\뽐뿌$(211.36) 08:25 2 0
2904429 기술적인 얘기인척 하려해도 늘 같은 소리인거 같음 ㅇㅇ갤로그로 이동합니다. 08:14 6 0
2904427 모바일 SDK 개발하는 팀은 어떤일해? 프갤러(220.92) 07:37 9 0
2904426 cyber security능 끝물이공 버려진field잉 무토깽(218.149) 07:24 10 0
2904425 러스트는 GUI부터 제대로 제공해야 됨 [1] ㅇㅇ(114.30) 06:48 23 0
2904422 요즘은 관리잘하면 50초중까지는 꼴리는듯 ㅇㅇ(118.235) 06:25 23 0
2904421 인지과학조져라 손발이시립디다갤로그로 이동합니다. 06:13 23 0
2904420 발명도둑잡기 차단이 왜 풀려있냐? ㅇㅇ(114.30) 06:11 19 0
2904418 중국인 댓글부대 한국여론조작 포착 [1] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 06:07 21 0
2904415 kqueue와 epoll의 시스템 아키텍처 및 설계 철학 비교 나르시갤로그로 이동합니다. 05:46 22 0
2904410 33살 중소3년차 똥통인생 이스펙으로 중견입사 가능하냐..? ㅇㅇ(118.235) 04:59 28 0
2904408 지잡대 졸업 30살인데 학벌 세탁원하는데 학사편입vs대학원 ㅇㅇ(203.232) 04:30 18 0
2904407 Claude cli 오늘 첨 써봤는데 개발자 왜 필요하냐 프갤러(101.235) 04:26 25 0
2904389 Clair.IO.Poller: 이번에 설계했다가 gg친 API ㅋㅋ 나르시갤로그로 이동합니다. 02:59 36 0
2904375 진짜 프로그래머들 ㅈㄴ부럽다 [3] ㅅ스맨갤로그로 이동합니다. 02:18 84 0
2904367 코딩 걍 첨부터 막히는데 어캄 [2] ㅅ스맨갤로그로 이동합니다. 01:54 60 0
2904364 자바 언어 좋지.. 추억과 낭만이 깃들인 언어 ㅋㅋ [2] 나르시갤로그로 이동합니다. 01:45 54 0
2904363 거래소 api들 잘 다루고 싶으면 뭐 부터 배우면 될까요 선배님들 [4] 프갤러(114.204) 01:43 45 0
2904359 0x [1] 루도그담당(58.233) 01:22 32 0
2904358 접시 ㅇㅅㅇ [6] 헤르 미온느갤로그로 이동합니다. 01:12 62 0
2904357 태연 ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 01:09 24 0
2904356 하루 한 번 헤르미온느 찬양 헤르 미온느갤로그로 이동합니다. 01:08 40 0
2904324 오픈소스 프로젝트를 하나 해볼까 [12] 에이도비갤로그로 이동합니다. 00:02 99 0
2904320 고 언어 음 좋지 나쁘지 않고 효율적이고 음 근데 [6] 프갤러(110.8) 11.23 61 0
2904316 www.basic4mcu.com 11월까지 서비스 종료 발명도둑잡기(118.216) 11.23 20 0
2904313 카리나가 맛집이넹 ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.23 69 0
2904309 그러고 보니 프갤에서 고랭 팬은 못본거 같은데 [5] chironpractor갤로그로 이동합니다. 11.23 54 0
2904303 클라우드 엔지니어 희망하는데 [2] 프갤러(118.235) 11.23 38 0
2904298 cursor 대체할만한거 있어? [2] ㅇㅇ(124.48) 11.23 51 0
2904295 개발만한 취미가 없는 것 같음 프갤러(61.73) 11.23 62 0
2904294 살면서 잘 한 일... 후배한테 노트북 키스킨 딱 맞는 카라스스킨 5천원 넥도리아(220.74) 11.23 18 0
2904291 에구궁.. 나님 일욜밤까지 모임하구와서 배불러양 [2] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.23 61 0
2904289 웹디자인은 이미 AI때문에 망한듯 [1] 프갤러(220.70) 11.23 49 0
2904285 왜 극좌들은 하나같이 왕따 당하는걸까? [4] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.23 47 0
2904266 인공지능 댓글 검사기 발명도둑잡기(118.216) 11.23 29 0
2904265 배달기사 레전드네 진짜; [7] 루도그담당(58.233) 11.23 77 0
2904264 [긴급속보] 한국 연구진이 노벨상 근거를 뒤집자 현재 난리난 천문학계 발명도둑잡기(118.216) 11.23 31 0
2904262 왕따재명 안쓰럽네 ㅠ ㅅ ㅠ [2] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.23 49 1
2904261 소프트웨어 이름으로 이렁 거 어때? [4] 나르시갤로그로 이동합니다. 11.23 58 0
2904259 긴sql도 셸스크립트도 보기 싫은데 [10] 슈퍼막코더(116.64) 11.23 69 0
2904256 이거 이직 중인데 두개중 어디가야하노 [2] 프갤러(58.231) 11.23 44 0
2904255 베린이평가좀 [1] ㅇㅇ(39.7) 11.23 52 0
2904247 간철수도 어셈블리어한다는데 [2] 타이밍뒷.통수한방(1.213) 11.23 69 0
2904245 국비조언좀요 [2] 프갤러(220.86) 11.23 61 0
2904244 어셈 짜는 중인데 헷갈린다 이기 [12] 루도그담당(58.233) 11.23 95 0
2904243 폴리글랏 툴체인이 나오면 프갤에 평화가 오려나? [10] chironpractor갤로그로 이동합니다. 11.23 69 0
2904242 베이스 ㅍㅌㅊ? ㅇㅇ(203.232) 11.23 50 0
2904240 나 불렀서? ㅇㅅㅇ [6] 프갤러(49.165) 11.23 66 0
2904237 탑 클라스 명문대 진학 퍼펙트 합격 가이드!T 프갤러(121.142) 11.23 50 1
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2