wxWidgets教程:socket通信之wxSocketClient应用

本文介绍如何使用wxWidgets中的wxSocketClient类实现跨平台Socket通信。包括创建Socket对象、连接服务器、发送及接收数据等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引子:笔者计划将之前做一个小工具用wxWidgets改写,目标是使其能在LINUX下运行;界面布局均用wxSmith构建并生成代码,Socket通信部分准备用wxWidgets中的wxSocketClient类来实现。
使用wxSocketClient类,首先要包含头文件:#include “wx/socket.h”
首先应创建对象,如下:
  1.         if(m_bConnected)
  2.         {
  3.                 return false;
  4.         }

  5.         ///创建SOCKET对象
  6.         m_pSocket = new wxSocketClient(); //wxSOCKET_NOWAIT
  7.         //m_s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  8.         if(m_pSocket == NULL)
  9.         {
  10.                 //DBG_LogStatus(0, wxT("socket()函数执行失败!"));
  11.                 return false;
  12.         }
复制代码
然后连接服务器,并确定是否连接成功:
  1.     wxIPV4address ServAddr;
  2.     bool ret;

  3.     ret = ServAddr.Hostname(szHostName);
  4.     ret = ServAddr.Service(nPort);
  5.     m_pSocket->Connect(ServAddr, false);
  6.     m_pSocket->WaitOnConnect(8);

  7.     if (false == m_pSocket->IsConnected())
  8.     {
  9.                 //DBG_LogStatus(0, wxT("connect()函数执行失败!"));
  10.                 return false;
  11.         }

  12.         ///设置已经连接的标志
  13.         m_bConnected=true;
复制代码
发送数据:
  1.     m_pSocket->Write(pRequestHeader, Length);
  2.     if (m_pSocket->Error())
  3.     {
  4.         wxSocketError nErr = m_pSocket->LastError();
  5.         //DBG_LogStatus(0, wxT("Write fail: %d"), nErr);
  6.         return false;
  7.     }
复制代码
读取数据:
  1.         m_pSocket->Read(buffer, 1024);
  2.         if (m_pSocket->Error())
  3.         {
  4.             wxSocketError nErr = m_pSocket->LastError();
  5.             //DBG_LogStatus(0, wxT("Write fail: %d"), nErr);
  6.             return;
  7.         }
  8.         long nLength = m_pSocket->LastCount();
复制代码
关闭Socket:
  1.         if(m_pSocket != NULL)
  2.         {
  3.             m_pSocket->Close();
  4.             m_pSocket->Destroy();
  5.         }i
复制代码
 
个人研究成果,wxWidgets的外围通讯库基本一直处于空缺状态,经过几天的研究,将我个人的研究成果上传共享。 本库基于官方于2011年最后一次更新的libctb-0.16版本为基础修改而来,工程使用CodeBlocks创建,相较原版的变更如下。 1.去掉了ctb命名空间,之前用起来感觉有点别扭,所以去掉了,不过为了兼容性考虑,以后可能加回来。 2.IOBase、SerialPort(继承自IOBase)、GPIB(继承自IOBase)三个类修改了构造函数,原来FIFO缓冲的尺寸固定为256,我觉得波特率高时候可能不够用,现在改为通过构造函数传参由用户指定,示例程序中使用4096。 3.修正一个严重的BUG,在SerialPort基类中的OpenDedvice方法中,当串口附加参数为NULL时,类内的附加参数结构体成员将在没有被始化就被使用,进而因参数混乱而导致收发异常,这个BUG目前我已将其修复并进行了测试。 4.对Win32环境下的GetAvailablePorts函数进行重写,现在可以获取串口号超过20的串口(原来的最多到Com20),并且可以得到串口的设备名信息。 5.以上修改只在Windows下测试通过,我手头没有Linux环境,对Linux相关的代码基本是靠着意念盲改,如果您发现了有错误疏漏,欢迎指正,能帮我改改就更好了,比如Linux下如何取得串口设备名我就还没弄明白。 压缩包里有可以编译静态库的工程,以及一个基于wxWidgets3.1的演示工程,就是一个简单的串口收发器,供大家参考。 由于串口功能的实现需要依赖Windows系统API,在Windows下,如果使用Mingw编译,请改你连·请关联静态库libsetupapi.a与libwinmm.a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值