본문 바로가기
C++/예제

[C++][MFC] TCP/IP 통신 (2) 채팅 프로그램 클라이언트 예제

by 부먹짱 2022. 9. 17.
반응형

 

TCP/IP 통신 (1) 채팅 프로그램 서버 예제

 

[C++][MFC] TCP/IP 통신 (1) 채팅 프로그램 서버 예제

MFC로 TCP/IP 통신을 사용해 간단한 채팅 프로그램을 구현하였다. TCP/IP 통신은 서버가 존재하고 해당 서버에 클라이언트가 접속하여 데이터를 보낸다. 그리고 서버에서는 클라이언트로부터 받은

bumukisbest.tistory.com

 

최종 결과 화면

 

TCP/IP 통신 채팅 프로그램 서버 예제에 이어 클라이언트 예제이다.

 

TCP 클라이언트

TCP_ClientDlg.h

 

private:
	SOCKET server_socket; // 서버 소켓

public:
	CListBox m_msg_list; // 메시지 ListBox
	CEdit ipEdit; // 서버 ip 입력 EditBox
	CEdit portEdit; // 서버 port 입력 EditBox
	CEdit msgEdit; // 메시지 입력 EditBox

	void InsertMsg(CString str); // 메시지 ListBox 메시지 추가
	afx_msg void ConnectBtnClicked(); // 서버 연결 버튼 클릭
	afx_msg void SendBtnClicked(); // 메시지 송신 버튼
	static UINT RecvFunc(LPVOID pParam); // 메시지 수신 버튼

 

TCP_ClientDlg.cpp

 

// 연결 버튼 클릭 함수
void CTCPClientDlg::ConnectBtnClicked()
{
	// 서버 소켓 생성
	server_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (server_socket == INVALID_SOCKET) InsertMsg("socket error");

	UINT port;
	CString strPort;
	portEdit.GetWindowText(strPort); // 사용자가 입력한 서버 포트 
	port = _tstoi(strPort);

	TCHAR strIp[20];
	ipEdit.GetWindowTextA(strIp, 20); // 사용자가 입력한 서버 ip

	SOCKADDR_IN srv_addr;
	char message[30];
	int strlen;

	srv_addr.sin_family = AF_INET;
	srv_addr.sin_addr.s_addr = inet_addr(strIp);
	srv_addr.sin_port = htons(port);

	// 서버에 연결
	if (connect(server_socket, (SOCKADDR*)&srv_addr, sizeof(srv_addr)) == -1)
		InsertMsg(_T("Connecting fail"));
	else InsertMsg(_T("Server Connected"));

	AfxBeginThread(RecvFunc, this); // 메시지 수신 스레드 시작
}

 

반응형

 

// 메시지 수신 스레드
UINT CTCPClientDlg::RecvFunc(LPVOID pParam) {

	CTCPClientDlg* pDlg = (CTCPClientDlg*)pParam;

	while (1) {
		char temp[1024] = "";
		int strlen;

		// 메시지 수신, 수신 메시지 길이 반환
		strlen = recv(pDlg->server_socket, temp, 1024, NULL);
		
		if (strlen == -1) // 오류
		{
			pDlg->InsertMsg("server disconnected");
			break;
		}
		else pDlg->InsertMsg(temp); // 메시지 수신, ListBox 메시지 추가
	}
	closesocket(pDlg->server_socket);
	return 0;
}

 

// 전송 버튼 클릭 함수
void CTCPClientDlg::SendBtnClicked()
{
	CString msg;
	msgEdit.GetWindowText(msg); // 사용자가 입력한 메시지
	int len = msg.GetLength();
	char* message = new char[len+1];
	strcpy(message, msg.GetBuffer(0));

	// 서버로 메시지 송신
	if (send(server_socket, message, 1024, 0) == -1)
	{
		InsertMsg("send error");
	}
	else
	{
		msg = "[Me] : " + msg;
		strcpy(message, msg.GetBuffer(0));
		InsertMsg(message);
		msgEdit.SetWindowTextA("");
	}
}

 

// 메시지 ListBox 추가 함수
void CTCPClientDlg::InsertMsg(CString str)
{
	m_msg_list.InsertString(-1, str);
	m_msg_list.SetTopIndex(m_msg_list.GetCount() - 1);
}

 

결과 화면

 

 

TCP_ClientDlg.h
0.00MB
TCP_ClientDlg.cpp
0.01MB

 

반응형

댓글