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); }
*이 게시글에 문제가 있을시 신고보단 지적을 먼저 부탁드립니다. 빠른시간안으로 수정하겠습니다. 감사합니다
제글을 재밌게 봐주셨다면 ♥(공감)한번씩 눌러주시면 감사합니다 좋은하루 되세요!