가장 간단한 서버와 클라이언트 (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();
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
React 구성 요소에서 소켓 이벤트 리스너가 여러 번 실행됩니다.기본적이지만 종종 간과되는 사이드 프로젝트를 하면서 배운 것이 있습니다. 이 프로젝트에는 단순히 두 가지 주요 부분이 포함되어 있습니다. 프런트 엔드: 반응 및 재료 UI 백엔드: Express, Typescript...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.