U E D R , A S I H C RSS

MFC/Socket

1. Socket?

  • ν†΅μ‹ ν• λ•Œ μ“°λŠ” 것.

2. μž‘λ™ μ‹œλ‚˜λ¦¬μ˜€

2.1. μ„œλ²„

  • μ†ŒμΌ“μ„ μ—°λ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈμ˜ 접속을 κΈ°λ‹€λ¦°λ‹€.

2.2. ν΄λΌμ΄μ–ΈνŠΈ

  • μ„œλ²„μ— μ ‘μ†ν•œλ‹€.

3. κ΅¬ν˜„

3.1. μ„œλ²„

  • μ„œλ²„λΌ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œ CSocket을 μƒμ†λ°›μ•„μ„œ ν΄λž˜μŠ€λΌ ν•˜λ‚˜ μƒμ„±ν•œλ‹€. CSocket은 MFCμ—μ„œ μ œκ³΅ν•΄μ£ΌλŠ” 클래슀

~cpp
class CServerSocket : public CSocket
{

	///////////////////////
	// member variables
	///////////////////////
protected:
	CWnd *m_pWnd;
	int id;	

public:

	///////////////////////
	// member functions
	///////////////////////
	CServerSocket();
	virtual ~CServerSocket();
	void Init(CWnd *pWnd, int nPortNum);

// Overrides
public:
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CServerSocket)
	public:
	virtual void OnAccept(int nErrorCode);
	//}}AFX_VIRTUAL

	// Generated message map functions
	//{{AFX_MSG(CServerSocket)
		// NOTE - the ClassWizard will add and remove member functions here.
	//}}AFX_MSG

};
  • μ•„λž˜λŠ” μ„œλ²„μ†ŒμΌ“ κ΅¬ν˜„λΆ€λΆ„μ€‘ μ€‘μš”λΆ€λΆ„

~cpp
void CServerSocket::Init(CWnd *pWnd, int nPortNum)
{
	m_pWnd = pWnd;
	id = nPortNum;
	Create(nPortNum); //νŠΉμ • 포트 번호둜 μ„œλ²„λΌ μƒμ„±ν•œλ‹€.
	Listen(); //ν΄λΌμ΄μ–ΈνŠΈμ˜ 접속을 κΈ°λ‹€λ¦°λ‹€.
}

3.1.1. λ§Œλ“  ν΄λž˜μŠ€λΌ μ‚¬μš©ν•˜λŠ” λΆ€λΆ„

~cpp
void COmokView::OnServercreate() 
{
	m_serverSocket.Init(this,SERVERPORT); //μ„œλ²„λΌ μƒμ„±ν•œλ‹€.
} 

///ν΄λΌμ΄μ–ΈνŠΈκ°€ μ ‘μ†ν•˜λŠ” 경우 μ΄λ²€νŠΈκ°€ λ°œμƒν•˜μ—¬ μ•„λž˜ ν•¨μˆ˜κ°€ ν˜ΈμΆœλœλ‹€.
LRESULT COmokView::OnAcceptClient(WPARAM wParam, LPARAM lParam)
{
	m_dataSocket = new CDataSocket;

	// accept to connect
	if(!m_serverSocket.Accept(*m_dataSocket)) // 접속을 λ°›λŠ”λ‹€. m_dataSocket을 톡해 ν†΅μ‹ ν•œλ‹€.
	{
		AfxMessageBox(_T("Accept failed"));
		return 0;
	}

	// init socket
	m_dataSocket->Init(this); //μ΄ˆκΈ°ν™”
	m_dataSocket->SetPort(SERVERPORT); //포트 μ„μ •
	CData temp;
	*m_dataSocket >> temp; //ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° λ©”μ‹œμ§€λΌ λ°›μ•˜λ‹€.
	AfxMessageBox(temp.m_strData); //ν…ŒμŠ€νŠΈ ν™•μΈμš©μœΌλ‘œ 받은 λ©”μ‹œμ§€λΌ λ„μ›Œμ€λ‹€.
	temp.m_strData = "TEST2"; 
	*m_dataSocket << temp; // ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ©”μ‹œμ§€λΌ λ³΄λ‚Έλ‹€.
	return 0L;
}

3.2. ν΄λΌμ΄μ–ΈνŠΈ

  • μ†ŒμŠ€ μ°Έκ³ .. -_- λ„ˆλ¬΄ κΈΈλ‹€.
  • 크게 μ•„λž˜μ™€ 같은 절차
    • m_dataSocket.Create() //
    • m_dataSocket.Connect(dlg1.m_strIpAddress, createBlkFile)
    • m_dataSocket.Init(this);

~cpp
	CIpAddressDlg dlg1;
	m_dataSocket = new CDataSocket;
	if(dlg1.DoModal() == IDOK)
	{
		if(!m_dataSocket->Create()) 
		{
			AfxMessageBox(_T("ν΄λΌμ΄μ–ΈνŠΈ μ†ŒμΌ“ 생성 μ‹€νŒ¨"));
			return FALSE;
		}
		// request to connect
		if(!m_dataSocket->Connect(dlg1.m_strIpAddress, 2000)) 
		{
			int err = GetLastError();
			AfxMessageBox(_T("μ„œλ²„ 접속 μ‹€νŒ¨"));
			return FALSE;
		}		
	}
	else
		return false;
	m_dataSocket->Init(this);
	CData data;
	data.m_strData = "TEST";
	data.m_index = 0;
	*m_dataSocket << data; //데이터 μ£Όκ³  λ°›κΈ° ν…ŒμŠ€νŠΈ
	*m_dataSocket >> data;
	AfxMessageBox(data.m_strData);
	return true;

3.3. μ°Έκ³  μ†ŒμŠ€

  • μ•„λž˜ μ†ŒμŠ€λŠ” μ†ŒμΌ“ ν…ŒμŠ€νŠΈ 용으둜 κ°„λ‹¨ν•˜κ²Œ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°€ λ©”μ‹œμ§€λΌ μ£Όκ³  λ°›λŠ” ν”„λ‘œκ·Έλž¨
    • 이 ν”„λ‘œκ·Έλž¨μ„ 2개 μ‹€ν–‰ μ‹œν‚¨λ‹€.
    • ν•œμͺ½μ—μ„œλŠ” μ„œλ²„ 생성을 선택 (XP의 경우 이 ν”„λ‘œκ·Έλž¨μ˜ μ„œλ²„λΌ ν—ˆμš©ν• μ§€ λ¬Όμ–΄λ³Όλ•Œ 예 선택)
    • λ‹€λ₯Έ ν•œμͺ½μ—μ„œλŠ” μ„œλ²„ 접속을 선택 IP와, IDλΌ λ‚˜μ™€ μžˆλŠ” κ·ΈλŒ€λ‘œ 놔두고(ν˜„μž¬ μ»΄ν“¨ν„°λΌλŠ” 의λΈ) OK 선택
    • 그러면 μ„œλ²„μͺ½μ—μ„œ TEST λ©”μ‹œμ§€λΌ λ°›μ•˜λ‹€λŠ”κ²ƒμ΄ λ‚˜μ˜€κ³ , 그것을 OK λˆ„λ₯΄λ©΄ ν΄λΌμ΄μ–ΈνŠΈμͺ½μ—μ„œ TEST2λ©”μ‹œμ§€λΌ λ°›μ•˜λ‹€κ³  λ‚˜μ˜¨λ‹€.
  • μ΄λŸ°κ²ƒμ„ μ΄μš©ν•΄μ„œ ν•΄ λ‚˜κ°ˆ μ˜ˆμ •
Upload:OmokSocketTest.zip

3.4. Thread

μ„œλ²„μ— MFC의 CSocket을 μ“°λŠ” 것은 그리 λ°”λžŒμ§ν•΄λ³΄μ΄μ§€ μ•Šλ„μš”. μƒλŒ€μ μœΌλ‘œ μ‚¬μš©ν•˜κΈ° μ€ μ–΄λ ΅κ² μ§€λ§Œ CAsyncSocket을 써보도둝 ν•˜μ„Έμš”. (κ°œμΈμ μœΌλ‘œλŠ” 이것도 λ³„λ‘œ μΆ”μ²œν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ MSNμ΄λ‚˜ λ„μ΄νŠΈμ˜¨μ²˜λŸΌ λŒ€ν˜• λ©”μ‹ μ €λΌ λ§Œλ“œλŠ”κ²Œ μ•„λ‹ˆλ‹ˆκΉŒ CAsyncSocketμœΌλ‘œλ„ μΆ©λΆ„ν•΄ 보이λ„μš”.) κΈ°νšŒκ°€ λœλ‹€λ©΄ MFC Socket말고 Winsock으둜 μ½”λ”©ν•΄λ³΄μ„Έμš”. --인수
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:42
Processing time 0.0180 sec