最簡單的CSocket通信流程


最簡單的CSocket通信是一個只有客戶端向服務器端發信息的單向通信。器雙方Socket之間的關系如下圖所示:

由上面這個十分簡單的過程很容易得出最簡單的Socket通信流程,如下圖所示:

要實現這樣一個完整流程需要三個套接字對象:客戶端一個,服務器端兩個(一個用於監聽,另一個用於接收客戶端發來的信息)。

具體代碼實現如下:

服務器端

在OnInitDialog()函數添加如下代碼,用於創建線程,接收客戶端發送的信息。

HANDLE hThread;
hThread = CreateThread(NULL, 0, StartServer, (LPVOID)this, 0, NULL); //創建線程:接收客戶端發送的信息
CloseHandle(hThread);

添加全局函數(線程函數)

DWORD WINAPI StartServer(LPVOID lParam)
{
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return 1;
}

CDlgTestDlg *aDlg = (CDlgTestDlg *)lParam;
CString strPort = "2000";
UINT nPort = atoi(strPort);
CString strText;

//socket------------------------------------------------
CSocket aSocket, serverSocket;
//創建接收端Socket
if (!aSocket.Socket())
{
char szError[256] = {0};
sprintf(szError, "創建套接字失敗: %d", GetLastError());
AfxMessageBox(szError);
return 1;
}

BOOL bOptVal = TRUE;
int bOptLen = sizeof(BOOL);
aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET);

if (!aSocket.Bind(nPort))
{
char szError[256] = {0};
sprintf(szError, "綁定失敗: %d", GetLastError());
AfxMessageBox(szError);
return 1;
}

if(!aSocket.Listen(10))
{
char szError[256] = {0};
sprintf(szError, "監聽失敗: %d", GetLastError());
AfxMessageBox(szError);
return 1;
}

aDlg->GetDlgItemText(IDC_EDIT_SHOW, strText);
strText += "Server Start! \r\n";
aDlg->SetDlgItemText(IDC_EDIT_SHOW, strText);

while(1)
{
if(!aSocket.Accept(serverSocket))
{
continue;
}
else
{
char szRecvMsg[256] = {0};
char szOutMsg[256] = {0};

serverSocket.Receive(szRecvMsg, 256);
sprintf(szOutMsg, "%s : %s \r\n", strPort, szRecvMsg);
aDlg->GetDlgItemText(IDC_EDIT_SHOW, strText);
strText = szOutMsg + strText;
aDlg->SetDlgItemText(IDC_EDIT_SHOW, strText);
serverSocket.Send("成功接收數據!", 50);
serverSocket.Close();
}
Sleep(10);
}
aSocket.Close();
serverSocket.Close();

return 0;
}

客戶端

添加按鈕控件,並在按鈕響應函數中添加如下代碼:

void CDlgTestClientDlg::OnBtnSend()
{
// TODO: Add your control notification handler code here

AfxSocketInit();
CSocket aSocket;
CString strIP = "127.0.0.1"; //IP地址
CString strPort = "2000"; //端口號
CString strSendMsg = "";
CString strText;

if(!aSocket.Create())
{
char szMsg[1024] = {0};
sprintf(szMsg, "create faild: %d", aSocket.GetLastError());
AfxMessageBox(szMsg);
return;
}

this->GetDlgItemText(IDC_EDIT_WRITE, strSendMsg);
if(strSendMsg=="")
{
AfxMessageBox("空字符串,不能發送!");
return;
}

int nPort = atoi(strPort);
if(aSocket.Connect(strIP, nPort))
{
char szRecValue[1024] = {0};
aSocket.Send(strSendMsg, strSendMsg.GetLength());
this->SetDlgItemText(IDC_EDIT_WRITE, "");

aSocket.Receive((void *)szRecValue, 1024);
sprintf(szRecValue, "%s \r\n", szRecValue);
this->GetDlgItemText(IDC_EDIT_SHOW, strText);
strText = szRecValue + strText;
this->SetDlgItemText(IDC_EDIT_SHOW, strText);
}
else
{
char szMsg[1024] = {0};
sprintf(szMsg, "create faild: %d", aSocket.GetLastError());
AfxMessageBox(szMsg);
}
aSocket.Close();

return;
}

以上完成了一個簡單的Socket單向通信流程,只有客戶端向服務器端發送信息。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM