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

2021. 9. 17. 11:15·Archive/Develop
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
'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 천재
  • 공지사항

    • 배고픕니다
  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바