[ Windows Socket ] 소켓 프로그래밍/소켓 통신 예제 간단한 채팅 프로그램

2021. 9. 17. 11:15·Archive/Develop
목차
  1. Server
  2. Client
728x90
반응형

Server

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h> // 윈도우즈기 때문에 들어 감 

void ErrorHandling(char * message);

int main(int argc, char *argv[]) {
	
	WSADATA wsaData; // 윈도우즈최적화 
	SOCKET hServSock, hClntSock;
	SOCKADDR_IN servAddr, clntAddr;
	
	int szClntAddr;
	char message[30];
	int strLen;
	
	
	if(argc != 2){
		printf("Usage : %s <port>\n", argv[0]);
		exit(1);
	} 
	// 윈도우즈이기 때문에 WSAStartup 이 들어감.
	//소켓 만들기 전에 들어가는데, MAKEWORD 는 버전 확인용이라고 생각하면 된다. 
	if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
		ErrorHandling("WSAStartup() error!");
	
	hServSock = socket(PF_INET, SOCK_STREAM, 0);
	if(hServSock == INVALID_SOCKET)
		ErrorHandling("socket() error");
	
	memset(&servAddr, 0, sizeof(servAddr));
	servAddr.sin_family=AF_INET;
	servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servAddr.sin_port=htons(atoi(argv[1]));
	
	if(bind(hServSock, (SOCKADDR*) &servAddr, sizeof(servAddr))==SOCKET_ERROR)
		ErrorHandling("bind() error");
	
	if(listen(hServSock, 5)==SOCKET_ERROR)
		ErrorHandling("listen() error");
	
	szClntAddr = sizeof(clntAddr);
	hClntSock = accept(hServSock, (SOCKADDR*)&clntAddr,&szClntAddr);
	if(hClntSock == INVALID_SOCKET)
		ErrorHandling("accept() error");
	while(1){
		memset(message, '\0', 30);
		strLen = recv(hClntSock, message, sizeof(message)-1, 0);
		if(strLen == -1)
			ErrorHandling("read() error!");
		printf("Message from client : %s \n", message);
		printf("메시지 입력 >>");
		gets(message);
		send(hClntSock,message,strlen(message)+1,0);
		
	}
	
	closesocket(hClntSock);
	closesocket(hServSock);
	WSACleanup();
	
	return 0;
}

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

 

Client

 

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
void ErrorHandling(char* message);

int main(int argc, char *argv[]) {
	
	WSADATA wsaData;
	SOCKET hSocket;
	SOCKADDR_IN servAddr;
	
	char message[30];
	char tmp[100];
	int strLen;
	
	if(argc!=3){
		printf("Usage : %s <IP> <port>\n", argv[0]);
		exit(1);
	}
	
	if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0)
		ErrorHandling("WSAStartup() error!");
	
	hSocket = socket(PF_INET, SOCK_STREAM, 0);
	if(hSocket == INVALID_SOCKET)
		ErrorHandling("socket() error!");
	
	memset(&servAddr, 0, sizeof(servAddr));
	servAddr.sin_family = AF_INET;
	servAddr.sin_addr.s_addr = inet_addr(argv[1]);
	servAddr.sin_port=htons(atoi(argv[2]));
	
	if(connect(hSocket, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
		ErrorHandling("connect() error!");
	
	while(1){
		printf("메시지 입력 >>");
		gets(tmp);
		send(hSocket, tmp, strlen(tmp)+1,0);
		strLen = recv(hSocket, message, sizeof(message)-1, 0);
		if(strLen <= 0)
			ErrorHandling("read() error!");
		printf("Message from server : %s \n", message);
	}
	
	closesocket(hSocket);
	WSACleanup();
	
	return 0;
}

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

 

 

 

먼저 Server 측 코드를 먼저 실행시켜준다.

 

 

실행시킬때, 포트번호를 같이 넘겨준다.

 

 

다음 클라이언트측 코드를 실행시킨다.

 

 

 

아이피와 포트번호를 맞춰준다.

 

나는 로컬에서 진행하기 때문에 127.0.0.1 로 아이피를 설정했다.

 

 

 

 

 

클라이언트 측에서 메시지를 입력하면,

서버 측에서 바로 메시지가 보이고, 그 다음 서버 측에서 메시지를 입력하면

클라이언트에서 메시지가 보이는 형식으로 코드를 작성했다.

 

 

 

728x90
반응형

'Archive > Develop' 카테고리의 다른 글

[ 정규표현식 ] 정규표현식 16진수 | 예시로 알아보는 정규표현식 기초  (0) 2021.09.28
[ 빅데이터분석기사 ] 데이터에 대해서  (0) 2021.09.18
[ Django ] SNS 서비스에 태그 기능을 추가해보자! | django taggit 설치/사용법 (2)  (2) 2021.09.01
[ Django ] SNS 서비스에 태그 기능을 추가해보자! | django taggit 설치/사용법 (1)  (0) 2021.09.01
[ Spring ] @Component 를 상속하는 어노테이션  (0) 2021.08.27
  1. Server
  2. Client
'Archive/Develop' 카테고리의 다른 글
  • [ 정규표현식 ] 정규표현식 16진수 | 예시로 알아보는 정규표현식 기초
  • [ 빅데이터분석기사 ] 데이터에 대해서
  • [ Django ] SNS 서비스에 태그 기능을 추가해보자! | django taggit 설치/사용법 (2)
  • [ Django ] SNS 서비스에 태그 기능을 추가해보자! | django taggit 설치/사용법 (1)
코뮤(commu)
코뮤(commu)
코딩으로 커뮤니케이션하는 코뮤입니다 😎
  • 코뮤(commu)
    코뮤(COMMU)
    코뮤(commu)
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Archive
        • Hacking
        • Develop
        • ETC
      • Algorithm
      • DB&Infra
      • ETC
      • Node
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • IT지식보따리
    • IT가 맛있다
    • IT 천재
  • 공지사항

    • 배고픕니다
  • 인기 글

  • 태그

    파이썬 알고리즘
    장고
    파이썬 문제
    코드업 기초
    백준 파이썬
    Codeup
    자바스크립트 API
    파이썬
    코드업 파이썬 기초 100제
    백준 풀이
    자바스크립트 객체
    Django
    Oracle
    Git
    oracle db
    카카오 100일 프로젝트
    오라클
    파이썬 기초 문제
    비박스
    javascript
    파이썬 백준
    백준 문제풀이
    자바스크립트
    C++
    Python
    보안뉴스
    docker
    파이썬 기초
    백준
    코드업
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
코뮤(commu)
[ Windows Socket ] 소켓 프로그래밍/소켓 통신 예제 간단한 채팅 프로그램
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.