MFC下CSocket程式設計詳解

shwenwen發表於2011-02-10

該示例程式碼在VS2003下聯調透過。

[@more@]MFC下CSocket程式設計詳解

轉自:http://blog.csdn.net/yejiansnake/archive/2008/03/13/2175778.aspx


MFC下CSocket程式設計詳解:

1. 常用的函式和注意事項(詳細的函式介面說明請檢視MSDN):

CSocket::Create 初始化(一般寫伺服器程式都不要用為好,用下面的 CSocket::Socket 初始化)

CSocket::Socket初始化

CSocket::SetSockOpt 設定socket選項

CSocket::Bind 繫結地址埠

CSocket::Connect 連線

CSocket::Listen 監聽

CSocket::Accept 接收外部連線的socket

CSocket::Send 傳送內容

CSocket::Receive 接收內容

CSocket::Close 關閉(不等於delete)

1) 在使用MFC編寫socket程式時,必須要包含都檔案。

2) AfxSocketInit() 這個函式,在使用CSocket前一定要先呼叫該函式,否則使用CSocket會出錯;並且該函式還有一個重要的使用方式,
就是在某個執行緒下使用 CSocket 前一定要呼叫,就算主執行緒呼叫了該函式,在子執行緒下使用 CSocket 也要先呼叫該函式,要不會出錯。

3) 還要注意的是, Create 方法已經包含了 Bind 方法,如果是以 Create 方法初始化的前提下不能再呼叫 Bind ,要不一定出錯。

2. 以下是使用例子程式碼,透過例子來學習如何使用 CSocket 進行程式設計, 並且附件上有完整的例子程式碼。例子的可以在我的釋出資源中找到:MFC下CSocket程式設計例子

1) 客戶端主要程式碼:

MFC下CSocket程式設計詳解 //初始化
MFC下CSocket程式設計詳解
AfxSocketInit();
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//建立 CSocket 物件
MFC下CSocket程式設計詳解
CSocket aSocket;
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 CString strIP;
MFC下CSocket程式設計詳解 CString strPort;
MFC下CSocket程式設計詳解 CString strText;
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
this->GetDlgItem(IDC_EDIT_IP)->GetWindowText(strIP);
MFC下CSocket程式設計詳解
this->GetDlgItem(IDC_EDIT_PORT)->GetWindowText(strPort);
MFC下CSocket程式設計詳解
this->GetDlgItem(IDC_EDIT_TEXT)->GetWindowText(strText);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//初始化 CSocket 物件, 因為客戶端不需要繫結任何埠和地址, 所以用預設引數即可
MFC下CSocket程式設計詳解
if(!aSocket.Create())
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
char szMsg[1024] = {0};
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 sprintf(szMsg,
"create faild: %d", aSocket.GetLastError());
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 AfxMessageBox(szMsg);
MFC下CSocket程式設計詳解
return;
MFC下CSocket程式設計詳解 }

MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//轉換需要連線的埠內容型別
MFC下CSocket程式設計詳解
int nPort = atoi(strPort);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//連線指定的地址和埠
MFC下CSocket程式設計詳解
if(aSocket.Connect(strIP, nPort))
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
char szRecValue[1024] = {0};
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//傳送內容給伺服器
MFC下CSocket程式設計詳解
aSocket.Send(strText, strText.GetLength());
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//接收伺服器傳送回來的內容(該方法會阻塞, 在此等待有內容接收到才繼續向下執行)
MFC下CSocket程式設計詳解
aSocket.Receive((void *)szRecValue, 1024);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 AfxMessageBox(szRecValue);
MFC下CSocket程式設計詳解 }

MFC下CSocket程式設計詳解
else
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
char szMsg[1024] = {0};
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 sprintf(szMsg,
"create faild: %d", aSocket.GetLastError());
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 AfxMessageBox(szMsg);
MFC下CSocket程式設計詳解 }

MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//關閉
MFC下CSocket程式設計詳解
aSocket.Close();
MFC下CSocket程式設計詳解

2)伺服器端程式碼:

MFC下CSocket程式設計詳解unsigned int StartServer(LPVOID lParam)
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
//初始化Winscok
MFC下CSocket程式設計詳解
if (!AfxSocketInit())
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
MFC下CSocket程式設計詳解 AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
MFC下CSocket程式設計詳解
return 1;
MFC下CSocket程式設計詳解 }

MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 m_exit
= false;
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 CServerDlg
*aDlg = (CServerDlg *)lParam;
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 CString strPort;
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 aDlg
->GetDlgItemText(IDC_EDIT_PORT, strPort);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 UINT nPort
= atoi(strPort);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//socket------------------------------------------------
MFC下CSocket程式設計詳解

MFC下CSocket程式設計詳解 CSocket aSocket, serverSocket;
MFC下CSocket程式設計詳解 //最好不要使用aSocket.Create建立,因為容易會出現10048錯誤MFC下CSocket程式設計詳解
if (!aSocket.Socket())
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
char szError[256] = {0};
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 sprintf(szError,
"Create Faild: %d", GetLastError());
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 AfxMessageBox(szError);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
return 1;
MFC下CSocket程式設計詳解 }

MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 BOOL bOptVal
= TRUE;
MFC下CSocket程式設計詳解
int bOptLen = sizeof(BOOL);

MFC下CSocket程式設計詳解 //設定Socket的選項, 解決10048錯誤必須的步驟
MFC下CSocket程式設計詳解 aSocket.SetSockOpt(SO_REUSEADDR, (void *)&bOptVal, bOptLen, SOL_SOCKET);
//監聽
MFC下CSocket程式設計詳解
if(!aSocket.Listen(10))
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
char szError[256] = {0};
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 sprintf(szError,
"Listen Faild: %d", GetLastError());
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 AfxMessageBox(szError);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
return 1;
MFC下CSocket程式設計詳解 }

MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 CString strText;
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 aDlg
->GetDlgItemText(IDC_EDIT_LOG, strText);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 strText
+= "Server Start! ";
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 aDlg
->SetDlgItemText(IDC_EDIT_LOG, strText);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
while(!m_exit)
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
MFC下CSocket程式設計詳解 //接收外部連線MFC下CSocket程式設計詳解
if(!aSocket.Accept(serverSocket))
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
MFC下CSocket程式設計詳解
continue;
MFC下CSocket程式設計詳解 }

MFC下CSocket程式設計詳解
else
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
char szRecvMsg[256] = {0};
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
char szOutMsg[256] = {0};
MFC下CSocket程式設計詳解
//接收客戶端內容:阻塞MFC下CSocket程式設計詳解 serverSocket.Receive(szRecvMsg, 256);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 sprintf(szOutMsg,
"Receive Msg: %s ", szRecvMsg);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 aDlg
->GetDlgItemText(IDC_EDIT_LOG, strText);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 strText
+= szOutMsg;
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 aDlg
->SetDlgItemText(IDC_EDIT_LOG, strText);
MFC下CSocket程式設計詳解
//傳送內容給客戶端
MFC下CSocket程式設計詳解 serverSocket.Send(
"Have Receive The Msg", 50);
MFC下CSocket程式設計詳解
//關閉MFC下CSocket程式設計詳解 serverSocket.Close();
MFC下CSocket程式設計詳解 }

MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 }

MFC下CSocket程式設計詳解
//關閉
MFC下CSocket程式設計詳解 aSocket.Close();
MFC下CSocket程式設計詳解 serverSocket.Close();
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 aDlg
->GetDlgItemText(IDC_EDIT_LOG, strText);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 strText
+= "Have Close!";
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 aDlg
->SetDlgItemText(IDC_EDIT_LOG, strText);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
return 0;
MFC下CSocket程式設計詳解}

MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 //繫結埠MFC下CSocket程式設計詳解
if (!aSocket.Bind(nPort))
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
char szError[256] = {0};
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 sprintf(szError,
"Bind Faild: %d", GetLastError());
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 AfxMessageBox(szError);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
return 1;
MFC下CSocket程式設計詳解 }

MFC下CSocket程式設計詳解

3) SDK 下的伺服器端程式碼

MFC下CSocket程式設計詳解 //子執行緒函式
MFC下CSocket程式設計詳解
unsigned int StartServer(LPVOID lParam)
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//初始化Winsock, AfxSocketInit() 也是封裝了這些語句, 不過 AfxSocketInit() 所做的事比這裡多些
MFC下CSocket程式設計詳解

MFC下CSocket程式設計詳解 WSADATA wsaData;
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//Winsock 的版本, 建議用1.1 ,相容性好
MFC下CSocket程式設計詳解
WORD wVersionRequested = MAKEWORD(1, 1);
MFC下CSocket程式設計詳解
int nResult = WSAStartup(wVersionRequested, &wsaData);
MFC下CSocket程式設計詳解
if (nResult != 0)
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
MFC下CSocket程式設計詳解
return 1;
MFC下CSocket程式設計詳解 }

MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//-----------------------------------------------------
MFC下CSocket程式設計詳解

MFC下CSocket程式設計詳解 m_exit
= false;
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 CServerDlg
*aDlg = (CServerDlg *)lParam;
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 CString strPort;
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 aDlg
->GetDlgItemText(IDC_EDIT_PORT, strPort);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 UINT nPort
= atoi(strPort);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//socket------------------------------------------------
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//介面物件
MFC下CSocket程式設計詳解
SOCKET aSocket, serverSocket;
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//定址相關結構
MFC下CSocket程式設計詳解
sockaddr_in serverSockaddr;
MFC下CSocket程式設計詳解 memset(
&serverSockaddr, 0, sizeof(serverSockaddr));
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 aSocket
= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
if (aSocket == INVALID_SOCKET)
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
{
MFC下CSocket程式設計詳解MFC下CSocket程式設計詳解
char szError[256] = {0};
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 sprintf(szError,
"Create Faild: %d", GetLastError());
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解 AfxMessageBox(szError);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
return 1;
MFC下CSocket程式設計詳解 }

MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//注意,該處非常重要,取值的正確與否決定關閉scoket後埠是否能正常釋放
MFC下CSocket程式設計詳解
BOOL bOptVal = TRUE;
MFC下CSocket程式設計詳解
int bOptLen = sizeof(BOOL);
MFC下CSocket程式設計詳解
MFC下CSocket程式設計詳解
//設定 socket 選項, SOL_SOCKET 和 SO_REUSEADDR 一起使用, 並且後面的引數如上,
MFC下CSocket程式設計詳解

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/143526/viewspace-1045771/,如需轉載,請註明出處,否則將追究法律責任。

MFC下CSocket程式設計詳解
請登入後發表評論 登入
全部評論

相關文章