CSocket客戶端(TCP)


首先是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函數獲取MFC程序中的主框架類指針是一個常用作法。

就是獲得應用程序主窗口的指針,AfxGetMainWnd()-> m_hWnd是主窗口的句柄

6、判斷一個CSocket是否Create成功:m_socket.m_hSocket == INVALID_SOCKET

  


免責聲明!

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



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