TCP/ip Soket data network
소켓 데이터 구조체 통신
// ServerDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "MFC_TCPSocket.h"
#include "ServerDlg.h"
#include "afxdialogex.h"
#include "winsock2.h"
#pragma comment (lib,"ws2_32.lib");
// ServerDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(ServerDlg, CDialog)
ServerDlg::ServerDlg(CWnd* pParent /*=NULL*/)
: CDialog(IDD_D_ServerDlg, pParent)
{
//m_ListenServer = INVALID_SOCKET; // 소켓 초기화
m_clientdlg = nullptr;
hServer = INVALID_SOCKET;
hServer = NULL;
hClient = NULL;
m_hWaitAccept = NULL;
m_evhWaitAccServer = NULL;
m_sRecvData = NULL;
m_hRecvS = NULL;
m_evhRecvS = NULL;
m_evhWaitAccServer = CreateEvent(NULL, FALSE, FALSE, NULL);
m_evhRecvS = CreateEvent(NULL, FALSE, FALSE, NULL);
m_iClientLen = 0;
m_iSaveData = 1;
ResetEvent(m_evhWaitAccServer);
ResetEvent(m_hWaitAccept);
ResetEvent(m_evhRecvS);
ResetEvent(m_hRecvS);
}
ServerDlg::~ServerDlg()
{
}
void ServerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_E_sLogEdit, ServerEditLog);
DDX_Control(pDX, IDC_L_sLoadSave, m_ServerSDL);
DDX_Control(pDX, IDC_L_sLoad, m_ServerCDL);
}
BEGIN_MESSAGE_MAP(ServerDlg, CDialog)
ON_BN_CLICKED(IDC_B_sConnecter, &ServerDlg::OnBnClickedBsconnecter)
ON_BN_CLICKED(IDC_B_sDisconnecter, &ServerDlg::OnBnClickedBsdisconnecter)
ON_BN_CLICKED(IDC_B_sLogreset, &ServerDlg::OnBnClickedBslogreset)
ON_BN_CLICKED(IDC_B_sClear, &ServerDlg::OnBnClickedBsclear)
ON_BN_CLICKED(IDC_B_sLoadClear, &ServerDlg::OnBnClickedBsloadclear)
ON_BN_CLICKED(IDC_B_sDataClear, &ServerDlg::OnBnClickedBsdataclear)
ON_BN_CLICKED(IDC_B_sLoad, &ServerDlg::OnBnClickedBsload)
ON_WM_DESTROY()
END_MESSAGE_MAP()
// ServerDlg 메시지 처리기입니다.
void ServerDlg::OnBnClickedBsconnecter()
{
if (hServer == NULL)
{
//소켓 생성 해준다
OpenSocket();
//그리고 다른송신 대기 시작.
}
else
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[동작중입니다.문제가 있다면 Disconnect 후 사용해주시기 바랍니다.] \r\n");
}
}
void ServerDlg::OpenSocket()
{
WSADATA data;
WSAStartup(0x0202, &data);
int iSzClient = 0 ;
//ip,port 값 받고 시작
GetDlgItemText(IDC_E_sOneN, m_isOneN);
GetDlgItemText(IDC_E_sTwoN, m_isTwoN);
GetDlgItemText(IDC_E_sThreeN, m_isThreeN);
GetDlgItemText(IDC_E_sFourN, m_isfourN);
GetDlgItemText(IDC_E_sPortN, m_isPortN);
CString IPNUM = m_isOneN + L"." + m_isTwoN + L"." + m_isThreeN + L"." + m_isfourN;
CStringA aIpnum = CStringA(IPNUM);
const char* ccIpNum = aIpnum;
char* cpIpNum = const_cast<char*>(ccIpNum);
//포트 변환
u_short usPortN = NULL;
usPortN = (u_short)_wtof(m_isPortN);
// 소켓 생성
if (m_isPortN == "")
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[Port에 값을 넣어주세요] \r\n");
return;
}
hServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
tServerSocket = {0};
ZeroMemory(&tServerSocket, sizeof(tServerSocket)); //메모리 비우기
tServerSocket.sin_family = AF_INET;
tServerSocket.sin_port = htons(usPortN);
tServerSocket.sin_addr.s_addr = (htons(INADDR_ANY)); //INADDR_ANY 현재의 내 IP 주소로 설정
//192.168.10.96?
if (hServer == INVALID_SOCKET) {
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[소캣이 생성되지 않았습니다. \r\n");
return;
}
else
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[소캣 생성 완료] \r\n");
if (bind(hServer, (struct sockaddr*)&tServerSocket, sizeof(tServerSocket)) == SOCKET_ERROR)
{//주소할당이 제대로 되었는지
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[바인딩 실패 하였습니다.] \r\n");
return;
}
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[클라이언트를 기다립니다.] \r\n");
ResetEvent(m_evhWaitAccServer);
m_hWaitAccept = (HANDLE)_beginthreadex(NULL, 0, _m_WaitAccept, this, 0, NULL);
if (hClient == INVALID_SOCKET)
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[신호를 받지 못했습니다. 다시연결해주시기 바랍니다.] \r\n");
return;
}
else
{
//Thread Create
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[신호가 연결되었습니다.] \r\n");
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[Data를 받을준비를 합니다.] \r\n");
ResetEvent(m_evhRecvS);
m_hRecvS = (HANDLE)_beginthreadex(NULL, 0, _m_sRecvThread, this, 0, NULL);
}
}
return;
ServerEditLog.LineScroll(ServerEditLog.GetLineCount(), 0);
}
unsigned ServerDlg::m_WaitAccept()
{
int iSzClient = 0;
iSzClient = sizeof(m_siClientSocket);
while (WaitForSingleObject(m_evhWaitAccServer, 100) == WAIT_TIMEOUT)
{
if (hServer == SOCKET_ERROR)
{//소켓 에러시 .
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[잃어들이기에 실패 하였습니다.] \r\n");
}
else
{
if (listen(hServer, SOMAXCONN) == SOCKET_ERROR)
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[잃어들이기에 실패 하였습니다.] \r\n");
}
else
{
hClient = accept(hServer, (SOCKADDR*)&m_siClientSocket, &iSzClient);
}
}
}
return 0;
}
void ServerDlg::compareMS()
{
if (m_sModel == m_sSubModel) // 두개의 값들이 들어가있나 확인 .
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==Model Success==] \r\n");
if (m_sLocation == m_sSubLocation)
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==Location Success==] \r\n");
if (m_sXaxis == m_sSubXaxis)
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==Xaxis Success==] \r\n");
if (m_sYaxis == m_sSubYaxis)
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==Yaxis Success==] \r\n");
if (m_sVoltage == m_sSubVoltage)
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==Voltage Success==] \r\n");
if (m_sCurrent == m_sSubCurrent)
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==Current Success==] \r\n");
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==All Success==] \r\n");
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==Wait Data ==] \r\n");
Sleep(700);
ServerEditLog.SetSel(0, -1);
ServerEditLog.ReplaceSel(L"[==Data Success==] \r\n");
}
else
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==Current Fail==] \r\n");
}
}
else
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==Voltage Fail==] \r\n");
}
}
else
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==Yaxis Fail==] \r\n");
}
}
else
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==Xaxis Fail==] \r\n");
}
}
else
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==Location Fail==] \r\n");
}
}
else
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[==Model Fail==] \r\n");
}
}
unsigned ServerDlg::m_sRecvThread() //리시브 스레드.
{
while (WaitForSingleObject(m_evhRecvS, 100) == WAIT_TIMEOUT) //100마다 땅땅 체크
{
while ((m_iClientLen = recv(hClient, (char*)&m_struct, sizeof(m_struct)*2, 0)) != 0)
{
if (hClient == NULL)
{
send(hClient, m_sRecvData, m_iClientLen, 0); //recv 값을 받았다고 클라이언트 에게 다시 알려줌 .
Sleep(1000);
if (m_sRecvData == NULL)
{//데이터 로딩중에 데이터 받으면 연결확인문 띄우기
Sleep(300);
ServerEditLog.SetSel(0, -1);
ServerEditLog.ReplaceSel(L"[Data 로딩중입니다.] \r\n");
}
}
else
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[Data를 성공적으로 받았습니다.] \r\n");
//데이터 받고나서 저장하고 저장되는대로 데이터 저장칸 날리고
//저장
C_DataSave();
if (m_iSaveData == 1)//첫번째 꺼는 Main 이되고
{
C_DataLoad();
}
else // 두번째 꺼는 Sub 가 된다 . (차후 위내용과 아래내용일 일치하는지 봐야함)
{
C_DataSubLoad();
//두번째 값 받고나서는 꼭 비교 해볼것.
compareMS();
}
// 이제 기존데이터 따로 저장했으니 새로저장할곳을 만들고
// 통신포트에서 대기중으로 다시 돌아와야한다.
}
}
}
return 0;
}
// 통신 이후 Data 수신 후 송신 두개의 Part를 만들어줘야함
//받아온 Data 를 저장해주어야하며
//비교해주는 문도 만들고 그값 리턴 필요
void ServerDlg::OnDestroy()
{
CDialog::OnDestroy();
// //소켓통신을 다썻다면 닫아주는 작업을 해준다
// //다이얼로그의 윈도우가 파게될떄 선언
WSACleanup();
}
void ServerDlg::OnBnClickedBsdisconnecter() //커넥트 해제 .
{
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[클라이언트가 종료되었습니다..] \r\n");
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[바인드 초기화중이니 잠시후 다시 시도해주세요] \r\n");
hServer = NULL;
m_hWaitSocket = NULL;
m_hWaitAccept = NULL;
m_evhWaitAccServer = NULL;
m_hRecvS = NULL;
m_evhRecvS = NULL;
SetEvent(m_evhWaitAccServer);
SetEvent(m_hRecvS);
closesocket(hClient);
closesocket(hServer);
closesocket(m_hWaitSocket);
SOCKET(NULL);
WSACleanup();
}
void ServerDlg::OnBnClickedBslogreset()
{
SetDlgItemText(IDC_E_sLogEdit, NULL);
}
void ServerDlg::OnBnClickedBsclear()
{
SetDlgItemText(IDC_E_sOneN, NULL);
SetDlgItemText(IDC_E_sTwoN, NULL);
SetDlgItemText(IDC_E_sThreeN, NULL);
SetDlgItemText(IDC_E_sFourN, NULL);
SetDlgItemText(IDC_E_sPortN, NULL);
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[IP,PORT 정보 클리어 ] \r\n");
}
void ServerDlg::OnBnClickedBsloadclear()
{
m_ServerSDL.ResetContent();
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[SaveList 정보 클리어 ] \r\n");
m_iSaveData = 1;
}
void ServerDlg::OnBnClickedBsdataclear()
{
m_ServerCDL.ResetContent();
ServerEditLog.SetSel(-1, -1);
ServerEditLog.ReplaceSel(L"[CallList 정보 클리어 ] \r\n");
}
void ServerDlg::C_DataSave() //받아온 데이터 저장
{
if (m_iSaveData == 1)
{
m_sModel = m_struct.cModel;
m_sLocation = m_struct.cLocation;
m_sXaxis = m_struct.cXaxis;
m_sYaxis = m_struct.cYaxis;
m_sVoltage = m_struct.cVoltage;
m_sCurrent = m_struct.cCurrent;
}
else
{
m_sSubModel = m_struct.cModel;
m_sSubLocation = m_struct.cLocation;
m_sSubXaxis = m_struct.cXaxis;
m_sSubYaxis = m_struct.cYaxis;
m_sSubVoltage = m_struct.cVoltage;
m_sSubCurrent = m_struct.cCurrent;
}
}
void ServerDlg::C_DataLoad() //값 띄우기 메인값.
{
m_ServerSDL.InsertString(0, L"Model Name");
m_ServerSDL.InsertString(1, m_sModel);
m_ServerSDL.InsertString(2, L"Location");
m_ServerSDL.InsertString(3, m_sLocation);
m_ServerSDL.InsertString(4, L"X_Axis");
m_ServerSDL.InsertString(5, m_sXaxis);
m_ServerSDL.InsertString(6, L"Y_Axis");
m_ServerSDL.InsertString(7, m_sYaxis);
m_ServerSDL.InsertString(8, L"Voltage");
m_ServerSDL.InsertString(9, m_sVoltage);
m_ServerSDL.InsertString(10, L"Current");
m_ServerSDL.InsertString(11, m_sCurrent);
m_iSaveData = 2;
}
void ServerDlg::C_DataSubLoad() //Sub 값 띄우기
{
m_ServerCDL.InsertString(0, L"Model Name");
m_ServerCDL.InsertString(1, m_sSubModel);
m_ServerCDL.InsertString(2, L"Location");
m_ServerCDL.InsertString(3, m_sSubLocation);
m_ServerCDL.InsertString(4, L"X_Axis");
m_ServerCDL.InsertString(5, m_sSubXaxis);
m_ServerCDL.InsertString(6, L"Y_Axis");
m_ServerCDL.InsertString(7, m_sSubYaxis);
m_ServerCDL.InsertString(8, L"Voltage");
m_ServerCDL.InsertString(9, m_sSubVoltage);
m_ServerCDL.InsertString(10, L"Current");
m_ServerCDL.InsertString(11, m_sSubCurrent);
}
void ServerDlg::OnBnClickedBsload() //기존값 불러오기 .
{
m_ServerSDL.InsertString(0, L"Model Name");
m_ServerSDL.InsertString(1, m_sModel);
m_ServerSDL.InsertString(2, L"Location");
m_ServerSDL.InsertString(3, m_sLocation);
m_ServerSDL.InsertString(4, L"X_Axis");
m_ServerSDL.InsertString(5, m_sXaxis);
m_ServerSDL.InsertString(6, L"Y_Axis");
m_ServerSDL.InsertString(7, m_sYaxis);
m_ServerSDL.InsertString(8, L"Voltage");
m_ServerSDL.InsertString(9, m_sVoltage);
m_ServerSDL.InsertString(10, L"Current");
m_ServerSDL.InsertString(11, m_sCurrent);
}
*이 게시글에 문제가 있을시 신고보단 지적을 먼저 부탁드립니다. 빠른시간안으로 수정하겠습니다. 감사합니다
제글을 재밌게 봐주셨다면 ♥(공감)한번씩 눌러주시면 감사합니다 좋은하루 되세요!
'프로그래밍 개발이야기 > MFC' 카테고리의 다른 글
TCP/ip Soket data 통신 _4(Client.CPP) (0) | 2019.06.14 |
---|---|
TCP/ip Soket data 통신 _3(Client.h) (0) | 2019.06.14 |
TCP/ip Soket data 통신 _1(Server.h) (0) | 2019.06.14 |