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);
}



 *이 게시글에 문제가 있을시  신고보단 지적을 먼저 부탁드립니다. 빠른시간안으로  수정하겠습니다. 감사합니다

제글을  재밌게 봐주셨다면  ♥(공감)한번씩 눌러주시면 감사합니다 좋은하루 되세요!

 

+ Recent posts