• c++ builder 阻塞模式 socke 教程 说明


    1.Client端

    阻塞模式常用在单通道Server自动响应收发数据里面,比如ClientA向ServerB发送报文,并且ClientA只需要它发送的这条数据ServerB对它有一个响应。其实c++ builder 里面阻塞模式的收发数据主要理解TWinSocketStream这个流。

    void __fastcall TForm1::btn_1Click(TObject *Sender)
    {
        //1.初始化一些socket参数
        ClientSocket1->Address="127.0.0.1";
        ClientSocket1->Port=10101;
        ClientSocket1->ClientType=ctBlocking;//此处表示socket是阻塞模式
    
    
        int TIMEOUT=300000,MAXLENGTH=1024;
    
        TWinSocketStream *pClientStream;//TWinSocketStream to read or write information over a blocking socket connection
        pClientStream=new TWinSocketStream(ClientSocket1->Socket,TIMEOUT);
    
        //2.连接Server端
        ClientSocket1->Open();
    
        //3.发送数据
        char sendBuf[1024];
        int sendCount=0;
        strcpy(sendBuf,E_send->Text.c_str()) ;
        sendCount=pClientStream->Write(sendBuf,strlen(sendBuf)+1);
        if(sendCount==0) ShowMessage("发送失败!");
    
        //4.接收数据
        char receiveBuf[1024];
        int Len=0;
        if (pClientStream->WaitForData(TIMEOUT))
            //在TIMEOUT时间内如果没有接收到数据程序是直会在此挂起,因此如果阻塞模式接收数据的话一般放在线程里面
            Len=pClientStream->Read(receiveBuf,MAXLENGTH);
        receiveBuf[Len]=0;
    
        Memo1->Lines->Add(receiveBuf);
    
    
    }

    2.Server端(TServerSocket 多线程阻塞模式收发数据)

    使用多线程的阻塞模式要从一个TServerClientThread对象中派生一个类,在类的execute()方法中写收发数据的代码。收数据一般通过TWinSocketStream流实现。

    这是派生的类的代码头

    //---------------------------------------------------------------------------
    
    #ifndef UnitServerThreadH
    #define UnitServerThreadH
    //---------------------------------------------------------------------------
    
    #include <ScktComp.hpp>
    #include <StdCtrls.hpp>
    #include "UnitMain.h"
    //---------------------------------------------------------------------------
    //---------------------------------------------------------------------------
    class TServerThread : public TServerClientThread
    {
    protected:
        void __fastcall ClientExecute(void);
        int __fastcall ReadStr(char * buf);
    public:
        __fastcall TServerThread(bool CreateSuspended, TServerClientWinSocket* ASocket,HWND hWnd);
        __fastcall ~TServerThread();
    private:
        TWinSocketStream *pStream;
        HWND m_hwnd;
    };
    #endif

    //cpp文件

    #include <vcl.h>
    #pragma hdrstop
    #include "UnitServerThread.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    __fastcall TServerThread::TServerThread(bool CreateSuspended, TServerClientWinSocket* ASocket,HWND hWnd) : TServerClientThread(CreateSuspended,ASocket)
    {
        m_hwnd=hWnd;
        FreeOnTerminate=false;
    }
    //---------------------------------------------------------------------------
    void __fastcall TServerThread::ClientExecute(void)
    {//当一个客户连接的时候进入ClientExecute
    
        //1.接收数据
        try
        {
            pStream=new TWinSocketStream(ClientSocket,60000);
            char buf[1024];
            memset(buf,0,sizeof(buf));
            try
            {
                int len=0;
                if(pStream->WaitForData(60000))
                {
                    len=pStream->Read(buf,1024);
                    buf[len]=0;
                }
            }
            catch(Exception &E)
            {
    
            }
             //2.发送数据
            ClientSocket->SendText("已经收到消息!消息为"+AnsiString(buf));
        }
        __finally
        {
            ClientSocket->Close();
            delete pStream;
        }
    }

    下面是主窗口代码

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "UnitMain.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
    {
        ServerSocket1->Port=10101;
        ServerSocket1->ServerType=stThreadBlocking; //设置为阻塞模式
    
        //指定缓存使用的线程的个数:如果第一个Client连接Server会自动生成一个TServerThread类对象
        //当这个客户端断开时,这个对象不会释放,当第二个Cliet连接时,会重用这个TServerThread而不是
        //重新创建此对象。ThreadCacheSize实际上指线程类不被释放的个数。
        ServerSocket1->ThreadCacheSize=10;
                                                    //
        ServerSocket1->Open() ;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::ServerSocket1GetThread(TObject *Sender,
          TServerClientWinSocket *ClientSocket,
          TServerClientThread *&SocketThread)
    {
        SocketThread=new TServerThread(false,ClientSocket,Form1->Handle);
    }
    //---------------------------------------------------------------------------
    
    本人新博客网址为:http://www.hizds.com
    本博客注有“转”字样的为转载文章,其余为本人原创文章,转载请务必注明出处或保存此段。c++/lua/windows逆向交流群:69148232
  • 相关阅读:
    markdown常用语法
    利用 js-xlsx 实现选择 Excel 文件在页面显示
    HTML中meta标签
    wxpy模块
    Python基础(3)
    Python基础(2)
    Python基础(1)
    Python之递归锁与互斥锁
    Python进程与线程
    Docker
  • 原文地址:https://www.cnblogs.com/zhangdongsheng/p/2236772.html
Copyright © 2020-2023  润新知