转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/

QT中的SOCKET编程

2008-10-07 23:13
http://hi.baidu.com/landuochong/blog/item/08268100cf5b6783e950cda9.html

操作系统:ARM-Linux
QT版本:QT-2.3.2-FOR-LINUX
GUI:Qtopia

在LINUX 下进行网络编程,我们可以使用LINUX提供的统一的套接字接口。但是这种方法牵涉到太多的结构体,比如IP地址,端口转换等,不熟练的人往往容易犯这样 那样的错误。QT中提供的SOCKET完全使用了类的封装机制,使用户不需要接触底层的各种结构体操作。而且它采用QT本身的signal-slot机 制,使编写的程序更容易理解。

QT中共提供四个与套按字相关的类,分别是:

QServerSocket:TCP-based server
QSocket:              Buffered TCP connection
QSocketDevice: Platform-independent low-level socket API
QSocketNotifier: Support for socket callbacks

下面介绍使用QT进行网络编程,我们使用一个简单的C/S模式网络程序说明如何使用QT中的套接字。同时我们用TCP和UDP两种协议实现这个程序(该程序客户端与服务端各向对方发送一个字符口串“abc”)

1、UDP实现
      UDP是不连接协议,没有客户端与服务端的概念。
     1)建立套接字相关对象
           QSocketDevice *MUReceiveSocket;   //套接字对象
            QSocketNotifier *MSocketNotifier;     //套接字监听对象
     2)初始化套接字相关对象
           MUReceiveSocket=new QSocketDevice(QSocketDevice::Datagram);   
           //UDP初始化
           QHostAddress MyAddress;
           QString FakeAddress;

FakeAddress = get_eth1_ip(); //取得接口IP
           MyAddress.setAddress(FakeAddress);
           MUReceiveSocket->bind(MyAddress,Port);   
          //绑定到指定网络接口地址(IP),指定逻辑端口

MSocketNotifier = new QSocketNotifier(MUReceiveSocket->socket(),QSocketNotifier::Read,0,"MSocketNotifier");
           //监听MUReceiveSocket套接字
     3)定义用实现响应slot
           virtual void OnMReceive();
           void Client::OnMReceive()
            {
                int ByteCount,ReadCount;
                 char *IncommingChar;

fprintf(stderr,"Load a piece of Message!\n");

ByteCount=MUReceiveSocket->bytesAvailable();
                IncommingChar=(char *)malloc(ByteCount+1);
                 ReadCount=MUReceiveSocket->readBlock(IncommingChar,ByteCount);
                IncommingChar[ByteCount]='\0';

fprintf(stderr,“%s“,IncommingChar); //打印接收的字符串
           }
     4)关联套接字的signal和接收slot
           connect(MSocketNotifier,SIGNAL(activated(int)),this,SLOT(OnMReceive()));
           //当MSocketNotifier检测到MUReceiveSocket活跃时调用OnMReceive
     5)发送字符串
           char information[20];
            strcpy(information,“abc“);
           MUReceiveSocket->writeBlock(information,length,MyAddress,2201);
2、TCP实现 
       TCP的实现与UDP的实现大同小异,它是面象连接的协议。这里只介绍与UDP不同的地方。
      服务端:
      1)套接字对象的定义
            比UDP多定义一个套接字,一个用来监听端口,一个用来通信。
            QSocketDevice *ServerSocket;
            QSocketDevice *ClientSocket;
            QSocketNotifier *ClientNotifier;
            QSocketNotifier *ServerNotifier;
       2)套接字的初始化

QHostAddress MyAddress;
            QString FakeAddress;

FakeAddress = "127.0.0.1";
            MyAddress.setAddress(FakeAddress);
            UINT Port=1234;
            ServerSocket=new QSocketDevice(QSocketDevice::Stream);
            ClientSocket=new QSocketDevice(QSocketDevice::Stream);
            ServerSocket->bind(MyAddress,Port);
            ServerSocket->listen(20); //20代表所允许的最大连接数

ClienttNotifier = new QSocketNotifier(ClientSocket->socket(),QSocketNotifier::Read,0,"ClientSocket");
            ServerNotifier = new QSocketNotifier(ServerSocket->socket(),QSocketNotifier::Read,0,"ServerSocket");
      3)响应连接(在定义slot中响应)
           当收到客户端的连接后,响应它,并以ClientSocket接收:
            ServerSocket->SetSocket(ClientSocket->socket());
       4)接收信息slot与UDP一致,这里不在叙述。
      客户端实现:
       客户端的实现与UDP实现大同小异,不同的地方只是客户端套接字不需要bind端口,因为连接上服 务端后TCP会保持这个连接,直到通信的结束。

http://blog.csdn.net/leo115/article/details/7363416

QT中的SOCKET编程的更多相关文章

  1. QT中的SOCKET编程(QT-2.3.2)

    转自:http://mylovejsj.blog.163.com/blog/static/38673975200892010842865/ QT中的SOCKET编程 2008-10-07 23:13 ...

  2. 读懂Java中的Socket编程

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  3. 读懂Java中的Socket编程(转)

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  4. java中的socket编程

    Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一.如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的.本文会介绍一下基于TCP/IP的S ...

  5. Qt中的多线程编程

    http://www.ibm.com/developerworks/cn/linux/l-qt-mthrd/ Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功 ...

  6. python进阶---Python中的socket编程

    初识socket编程 一.前言 socket基于C\S架构(客户端\服务端)的编程模型,在Python中是以socket模块存在的. Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是 ...

  7. Go中的Socket编程

    在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程.你想过这些情景么?我们每天打开浏览器浏览网页时,浏览器进程怎么和W ...

  8. Qt中的串口编程之三

    QtSerialPort 今天我们来介绍一下QtSerialPort模块的源代码,学习一下该可移植的串口编程库是怎么实现的. 首先,我们下载好了源代码之后,使用QtCreator打开整个工程,可以看到 ...

  9. 5.关于QT中的网络编程,QTcpSocket,QUdpSocket

     1 新建一个项目:TCPServer.pro A  修改TCPServer.pro,注意:如果是想使用网络库,需要加上network SOURCES += \ TcpServer.cpp \ T ...

随机推荐

  1. 左右Cwnd::Create()功能出现afxwin1.inl line:21错误的解决方案

    我最近在调试dll时刻,有一种模糊的断言错误,它是由主程序创建MFC 扩张DLL控制出口(从控制继承CWnd分类)时刻,呼叫Create()下列说法错误的功能: watermark/2/text/aH ...

  2. 10g RAC 采用service达到taf

    service由于oracle数据库中的一个关键概念,利用得当,可以轻松地管理数据库,提高数据库的工作效率. 经service.oracle可以实现server side  taf,简单化client ...

  3. Android framework召回(3)binder使用和IBinder BpRefbase IInterface INTERFACE 之间的关系

    status_t AudioSystem::setStreamVolumeIndex(audio_stream_type_t stream, int index, audio_devices_t de ...

  4. 手把手教你启用Win10的Linux子系统(超详细)

    原文:手把手教你启用Win10的Linux子系统(超详细) 版权声明:转载请保留出处,谢谢! https://blog.csdn.net/zhangdongren/article/details/82 ...

  5. WPF,SilverLight中直线的样式示例

    原文:WPF,SilverLight中直线的样式示例 XAML代码:// LineStyle.xaml<Viewbox Width="600" Height="50 ...

  6. matlab 深度学习

    0. 超参的定义 超参的定义直接使用结构体: opts.alpha = 1; opts.batchsize = 50; opts.numepoch = 5; 1. Autoencoder Train ...

  7. WPF教程002 - 实现Step步骤条控件

    原文:WPF教程002 - 实现Step步骤条控件 在网上看到这么一个效果,刚好在用WPF做控件,就想着用WPF来实现一下 1.实现原理 1.1.该控件分为2个模块,类似ComboBox控件分为Ste ...

  8. 用callgraph生成的函数调用关系图

    Wu Zhangjin 创作于 2015/04/05 评论打赏 By Falcon of TinyLab.org 2015/04/03 1 故事缘由 源码分析是程序员离不开的话题.无论是研究开源项目, ...

  9. RPC的发展历史(本质就是双方定义好协议,传递参数后远程调用)

    服务器通讯原理就是一台socket服务器A,另一台socket客户端B,现在如果要通讯的话直接以流方式写入或读出. 这样能实现通讯,但有个问题.如何知道更多信息?比如需要发送流大小,编码,Ip等. 这 ...

  10. linux下一个rsync工具和配置

    本文介绍了整个基本:http://www.2cto.com/os/201308/238733.html 一些简单的备忘录: 1. ubuntu下通过apt-get就可以安装: 2. 配置文件/etc/ ...