가장 간단한 서버와 클라이언트 (CSocket 사용)

3428 단어 socket
기능: 서버 측 프로그램이 감청 상태에 있어 클라이언트의 연결을 기다립니다.클라이언트가 데이터를 보낸 후 서버에서 메시지를 보내고 연결을 닫습니다!
원본 다운로드
서버(스니퍼 스레드 하나) 코어 코드:
BOOL CListenThread::InitInstance()

{

// 	if (!AfxSocketInit())

// 	{

// 		AfxMessageBox(IDP_SOCKETS_INIT_FAILED);

// 		return FALSE;

// 	}

	m_bListening = TRUE;			//              

	while(1)

	{

		if(m_bListening)

		{

			StartListen();

		}

	}



	return TRUE;

}



int CListenThread::ExitInstance()

{

	StopListen();



	return CWinThread::ExitInstance();

}



BOOL CListenThread::StartListen()

{

	CString sResult;

	try

	{

		if(m_pListenSocket == NULL)

			m_pListenSocket = new CSocket;

		if(m_pListenSocket && m_pListenSocket->Create(m_nPort))		// Create()     Bind()

		{

			m_pListenSocket->Listen();

			m_pMainDlg->ShowInfo("      ");

			PostMessage(m_pMainDlg->GetSafeHwnd(), WM_ENABLE_LISTENING, 0, 0);

			while(1)

			{

				CSocket clientSocket;

				if(m_pListenSocket->Accept(clientSocket))

				{

					char buffer[1024] = {0};

					CString sText;

					clientSocket.Receive(buffer, 1024);

					sText = buffer;

					m_pMainDlg->ShowInfo(sText);



					CString s = "Thank you, JoeBlack";

					clientSocket.Send(s, s.GetLength());

//					send(clientSocket.m_hSocket, s, s.GetLength(), 0);		//       



					if(sText == "close")			// stop listening

					{

						StopListen();

						break;

					}

					else if(sText == "quit")		// post a message to let the main thread delete listen-thread

					{

						EndMyThread();

						return TRUE;

					}

				}

			}

			return TRUE;

		}

	}

	catch (CException* e)

	{

		char str[300] = {0};

		e->GetErrorMessage(str, 300);

		sResult.Format("      ,   :%d", str);

		m_pMainDlg->ShowInfo(sResult);

	}

	catch(...)

	{

		int err;

		err = WSAGetLastError();

		sResult.Format("      ,   :%d", err);

		m_pMainDlg->ShowInfo(sResult);

	}

	m_bListening = FALSE;



	return FALSE;

}



BOOL CListenThread::StopListen()					//        

{

	if(m_pListenSocket)

	{

		m_pListenSocket->Close();

		delete m_pListenSocket;

		m_pListenSocket = NULL;

		m_pMainDlg->ShowInfo("Stop listening successful");

		m_bListening = FALSE;

		m_pMainDlg->PostMessage(WM_ENABLE_LISTENING, 1, 0);	//  “    ”      

	}

	return TRUE;

}



BOOL CListenThread::EndMyThread()						//   CSocket      

{

	StopListen();

	m_pMainDlg->ShowInfo("Exit from Listen-Thread");

	PostMessage(m_pMainDlg->GetSafeHwnd(), WM_FREE_LISTENTHREAD, 0, 0);



	return TRUE;

}


서버 프로그램은 감청을 실현하여close나quit를 받았을 때 감청을 멈추고 클라이언트가 데이터를 보내도 받지 않습니다.서버 측이 창의 '감청 열기' 를 클릭하면 감청 라인을 다시 열 수 있습니다.
클라이언트 프로그램(server에 메시지를 보내고 반환 값을 받음):
void CClientAppDlg::OnBtnSend()

{

	CSocket sendSocket;

	if(sendSocket.Create())

	{

		if(sendSocket.Connect("127.0.0.1", 5050))

		{

			UpdateData();

			sendSocket.Send(m_strEdit, m_strEdit.GetLength());

			Sleep(100);  //           



			char buf[1024] = {0};

			CString sResponse;

			while(sendSocket.Receive(buf, 1024))

			//while(recv(sendSocket, buf, 1024, 0))

			{

				sResponse += buf;

			}



			MessageBox(sResponse);

			sendSocket.Close();

		}

	}

}

좋은 웹페이지 즐겨찾기