반응형
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);
}
반응형
'C++ > 예제' 카테고리의 다른 글
[C++][MFC] UDP 통신 (2) 채팅 프로그램 멀티캐스트 예제 (7) | 2022.09.19 |
---|---|
[C++][MFC] UDP 통신 (1) 채팅 프로그램 1대1 예제 (2) | 2022.09.19 |
[C++][MFC] TCP/IP 통신 (1) 채팅 프로그램 서버 예제 (1) | 2022.09.17 |
[C][C++] 배열을 활용한 바이트 스왑 예제 (0) | 2022.04.07 |
댓글