TCP/ip Soket data network 
소켓 데이터 구조체 통신

 

// Client.cpp : 구현 파일입니다.
//
#pragma once
#include "stdafx.h"
#include "MFC_TCPSocket.h"
#include "Client.h"
#include "afxdialogex.h"
#include "winsock2.h"
#pragma comment (lib,"ws2_32.lib");


// Client 대화 상자입니다.

IMPLEMENT_DYNAMIC(Client, CDialog)

Client::m_cSendData m_struct;

Client::Client(CWnd* pParent /*=NULL*/)
: CDialog(IDD_D_ClientDlg, pParent)
{
m_hClient = INVALID_SOCKET;
m_hClient = NULL;
m_hcServer = NULL;


}

Client::~Client()
{
}

void Client::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT7, m_ClientEditLog);
DDX_Control(pDX, IDC_L_cState, Client_List);
}


BEGIN_MESSAGE_MAP(Client, CDialog)
ON_BN_CLICKED(IDC_B_cConnect, &Client::OnBnClickedBcconnect)
ON_BN_CLICKED(IDC_B_cSend, &Client::OnBnClickedBcsend)
ON_BN_CLICKED(IDC_B_cDisconnect, &Client::OnBnClickedBcdisconnect)
ON_BN_CLICKED(IDC_B_cClear, &Client::OnBnClickedBcclear)
ON_BN_CLICKED(IDC_B_cLogreset, &Client::OnBnClickedBclogreset)
ON_BN_CLICKED(IDC_B_cClientClear, &Client::OnBnClickedBcclientclear)
ON_BN_CLICKED(IDC_B_cStateClear, &Client::OnBnClickedBcstateclear)
ON_WM_DESTROY()
END_MESSAGE_MAP()


// Client 메시지 처리기입니다.


void Client::OnBnClickedBcconnect()
{
//ip,port 값 받고 시작 
  GetDlgItemText(IDC_E_cOneN, m_icOneN);
GetDlgItemText(IDC_E_cTwoN, m_icTwoN);
  GetDlgItemText(IDC_E_cThreeN, m_icThreeN);
  GetDlgItemText(IDC_E_cFourN, m_icfourN);

if (m_hClient == NULL)
{
OpenClientSocket();
}
else
{
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[동작중입니다.문제가 있다면 Disconnect 후 사용해주시기 바랍니다.] \r\n");
}

}


void Client::OnBnClickedBcsend()
{
Client_List.ResetContent();
// 값을 받아오고 시작 
GetSendData();

ClientSend();
//서버한테 보내주고 내 state 에 정보 뿌려줌 
Client_List.InsertString(0, L"Model Name");
Client_List.InsertString(1, m_cscModel);
Client_List.InsertString(2, L"Location");
Client_List.InsertString(3, m_cscLocation);
Client_List.InsertString(4, L"X_Axis");
Client_List.InsertString(5, m_cscXaxis);
Client_List.InsertString(6, L"Y_Axis");
Client_List.InsertString(7, m_cscYaxis);
Client_List.InsertString(8, L"Voltage");
Client_List.InsertString(9, m_cscVoltage);
Client_List.InsertString(10, L"Current");
Client_List.InsertString(11, m_cscCurrent);
}


void Client::GetSendData()
{
// edit 의 CString 형 data 저장 .
GetDlgItemText(IDC_E_cModelName, m_cscModel);
GetDlgItemText(IDC_E_cLocation, m_cscLocation);
GetDlgItemText(IDC_E_cXaxis, m_cscXaxis);
GetDlgItemText(IDC_E_cYaxis, m_cscYaxis);
GetDlgItemText(IDC_E_cVoltage, m_cscVoltage);
GetDlgItemText(IDC_E_cCurrent, m_cscCurrent);
}


void Client::OpenClientSocket()
{
WSADATA data;
WSAStartup(0x0202, &data);  //소켓통신을 하기위해 필요한 start 문 정확한 자료는 따로 찾아봐야함.

GetDlgItemText(IDC_E_cPortN, m_icPortN);
u_short uscPortN = NULL;
uscPortN = (u_short)_wtof(m_icPortN);

if (m_icPortN == "")
{
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[Port에 값을 넣어주세요] \r\n");
return;
}

m_hClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);// 소켓 생성 

//내 주소 127.0.0.1   
//주소 받아와서 Cstring to char* 변환.
CString csFullAddr = m_icOneN + L"." + m_icTwoN + L"." + m_icThreeN + L"." + m_icfourN;
CStringA csAFullAddr = CStringA(csFullAddr);
const char* cFullAddr = csAFullAddr;
char* cpFullAddr = const_cast<char*>(cFullAddr);



tClientSocket = {0};
ZeroMemory(&tClientSocket, sizeof(tClientSocket));
tClientSocket.sin_family = AF_INET;
tClientSocket.sin_port = htons(uscPortN);
tClientSocket.sin_addr.s_addr = inet_addr(cpFullAddr); //htons(INADDR_ANY);//inet_addr("IP Num");

if (m_hClient == INVALID_SOCKET)
{
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[소캣이 생성되지 않았습니다. \r\n");
return;
}
else
{
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[소캣 생성 완료] \r\n");

if (m_hcServer = connect(m_hClient, (struct sockaddr*)&tClientSocket, sizeof(tClientSocket)) == SOCKET_ERROR)
{
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[연결 실패] \r\n");
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[IP 나 Port 번호를 다시 확인해주세요 ] \r\n");
if (SOCKET_ERROR == WSAEINTR)
{
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[WSACancelBlockingCall(Wsapiref_704y.asp) 호출로 인해 차단 작업이 중단되었습니다.] \r\n");
closesocket(m_hClient);
}
else if (SOCKET_ERROR == -1)
{
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[-1 err 타임에러 발생  ] \r\n");
closesocket(m_hClient);
}



return;
}
else
{
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[연결 성공 \r\n 이제부터 데이터를 보낼수있습니다.] \r\n");







}
return;
}


m_ClientEditLog.LineScroll(m_ClientEditLog.GetLineCount(), 0); //자동으로 스크롤 되도록 
}

void Client::OnBnClickedBcdisconnect()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.

WSACleanup();
m_hClient = NULL;
SOCKET(NULL);
closesocket(m_hcServer);
closesocket(m_hClient);
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[클라이언트가 종료되었습니다..] \r\n");
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[바인드 초기화중이니 잠시후 다시 시도해주세요] \r\n");
}


void Client::OnDestroy()
{
CDialog::OnDestroy();
WSACleanup();

// TODO: 여기에 메시지 처리기 코드를 추가합니다.
}


void Client::OnBnClickedBcclear()
{
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[현재의 모든기록과 데이터를 Client 상에서 clear합니다.] \r\n");

m_cscModel.Empty();
m_cscLocation.Empty();
m_cscXaxis.Empty();
m_cscYaxis.Empty();
m_cscVoltage.Empty();
m_cscCurrent.Empty();

SetDlgItemText(IDC_E_cModelName, NULL);
SetDlgItemText(IDC_E_cLocation, NULL);
SetDlgItemText(IDC_E_cXaxis, NULL);
SetDlgItemText(IDC_E_cYaxis, NULL);
SetDlgItemText(IDC_E_cVoltage, NULL);
SetDlgItemText(IDC_E_cCurrent, NULL);
}


void Client::OnBnClickedBclogreset()
{
SetDlgItemText(IDC_E_cLogEdit, NULL);
}


void Client::OnBnClickedBcclientclear()
{
SetDlgItemText(IDC_E_cOneN, NULL);
SetDlgItemText(IDC_E_cTwoN, NULL);
SetDlgItemText(IDC_E_cThreeN, NULL);
SetDlgItemText(IDC_E_cFourN, NULL);
SetDlgItemText(IDC_E_cPortN, NULL);
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[IP,PORT 정보 클리어 ] \r\n");

}


void Client::OnBnClickedBcstateclear()
{
Client_List.ResetContent();
m_ClientEditLog.SetSel(-1, -1);
m_ClientEditLog.ReplaceSel(L"[State 정보 클리어 ] \r\n");
}

void Client::ClientSend()
{


GetSendData(); //데이터 받아오고 
m_struct.cModel    = m_cscModel;
m_struct.cLocation  = m_cscLocation;
m_struct.cXaxis     = m_cscXaxis;
m_struct.cYaxis     = m_cscYaxis;
m_struct.cVoltage   = m_cscVoltage;
m_struct.cCurrent   = m_cscCurrent;



send(m_hClient, (char*)&m_struct, sizeof(m_struct), 0); //위 내용을 보낸다 Send

}

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


TCP/ip Soket data network 
소켓 데이터 구조체 통신 

 

#pragma once
#include "afxwin.h"


// Client 대화 상자입니다.

class Client : public CDialog
{
DECLARE_DYNAMIC(Client)

public:
Client(CWnd* pParent = NULL);   // 표준 생성자입니다.
virtual ~Client();

// 대화 상자 데이터입니다.
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_D_ClientDlg };
#endif

protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.
afx_msg void OnBnClickedBcconnect();
afx_msg void OnBnClickedBcsend();
afx_msg void OnBnClickedBcdisconnect();
afx_msg void OnDestroy();
afx_msg void OnBnClickedBcclear();
afx_msg void OnBnClickedBclogreset();
afx_msg void OnBnClickedBcclientclear();
afx_msg void OnBnClickedBcstateclear();
CListBox Client_List;
CEdit m_ClientEditLog;
DECLARE_MESSAGE_MAP()

private:
void GetSendData();
void OpenClientSocket();
void ClientSend();
void CloseClient();
// void SendMsg();



public:
CString m_icOneN;
CString m_icTwoN;
CString m_icThreeN;
CString m_icfourN;
CString m_icPortN;

CString m_cscModel;
CString m_cscLocation;
CString m_cscXaxis;
CString m_cscYaxis;
CString m_cscVoltage;
CString m_cscCurrent;

SOCKET m_hClient;
SOCKET m_hcServer;
SOCKADDR_IN tClientSocket;

/*struct m_cSendData;*/

struct m_cSendData
{
CString cModel = 0;
CString cLocation = 0;
CString cXaxis = 0;
CString cYaxis = 0;
CString cVoltage = 0;
CString cCurrent = 0;

};



};


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

+ Recent posts