首先是UDP和TCP的區別:
UDP是不連接服務器,每次發送數據的時候需要服務器的IP;而TCP是先連接服務器,保持常連接,然后直接發送不需要IP。
下面是TCP客戶端:
1、新建項目,TestCSocket。
2、新建一個CSocket的派生類,CSockSon:CSocket。是因為只有CSocket的的虛函數OnReceive才可以在客戶端上接收數據,而一個純CSocket對象的OnReceive是空的,
所以后面要重寫此函數來處理接收數據。
3、獲得CSockSon的對象。
在Dlg.h中定義一個CSockSon對象:public:CSockSon m_sock;
首先需要在AppInit中初始化SOCKEt:AfxSocketInit();(為什么要初始化可以看Winapi,無非就是打包底層api函數);
在連接按鈕函數里:m_sock.Create();(這里可以不加參數,因為是TCP,所有參數在Connect里加入);
m_socku.Connect(CString("192.168.43.74"),8080);(然后連接到服務器IP,沒寫的參數都是缺省值,代表TCP)
此時已經創建了一個連接到服務器的套接字對象。
4、發送數據到服務器。
m_sock.Send("123","123".GetLenth(),...);(反正TCP就是使用這個函數來發送數據,而UDP是使用SendTo,SendTo里制定了Ip)
5、接收數據。
首先在Dlg.cpp中增加一個方法,用於將從OnReceive中接收到的數據打印出來。
void TestCSocket::OnReceive(LPCTSTR text)//注意兩個OnReceive是不一樣的,這個是自定義的,text是socket對象的OnReceive方法回調信息,代表接收數據
{
MessageBox(text);
}
接下來,需要在回調函數中將獲取的數據傳到上面那個函數里。在第二步中的派生類的CSockSon.cpp中重寫虛函數OnReceive():
void CSockU::OnReceive(int nErrorCode)
{
CString sziP;//用來存發來IP
UINT nPort;//端口
char s[512];//數據
int rLen=ReceiveFrom(s,sizeof(s),sziP,nPort);//返回值,成功就返回接收長度
s[rLen]=0;//是為了不出現亂碼
CTestCSocketDlg *pDlg= (CTestCSocketDlg*)AfxGetMainWnd();//獲得主窗口的句柄,需要加入主窗口的頭文件#include "TestCSocketDlg.h"
pDlg->OnReceive(s);//調用自定義函數,把s傳過去
CSocket::OnReceive(nErrorCode);
}
注意:CWnd* AfxGetMainWnd( );
就是獲得應用程序主窗口的指針,AfxGetMainWnd()-> m_hWnd是主窗口的句柄
6、判斷一個CSocket是否Create成功:m_socket.m_hSocket == INVALID_SOCKET