转自: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. 未能找到 CodeDom 提供程序类型“Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.3.0, Culture=neutral, PublicKeyToken=31bf385

    网上说的解决方案有两个,第一:什么删除目录下的.java文件,   这个方法 对我没效果:第二:删除.csproj文件中.DotNetCompilerPlatform.CSharpCodeProvid ...

  2. 打造开发React Native的Sublime

     之前一年多一直用Sublime Text做前端开发,最近做React开发,发现不太好用,就尝试其他编辑器.WebStorm和VS Code都用过,WebStorm基本不用装插件,可以直接用,但用习惯 ...

  3. react中属性默认值是true?

    看到项目代码中 return ( <MyWebView state="Login" title="登录app" ref="login" ...

  4. MyEclipse各种版本号注冊码

    一:MyEclipse_6.0.1GA_E3.3.1_FullStackInstaller注冊码 Subscriber:javp Subscription Code:wLR7ZL-655551-685 ...

  5. IE8支持function.bind()方法

    这个 bind 方法仅仅有在 ie10 版本号的浏览器才得到原生支持,低于该版本号的浏览器下运行时会得到一个 undefined 的错误提示.于是仅仅好再次上网 google 解决方式,功夫不负有心人 ...

  6. Method for browsing internet of things and apparatus using the same

    A method for browsing Internet of things (IoT) and an apparatus using the same are provided. In the ...

  7. matlab gabor 滤波器

    0. gabor 基本原理 1. matlab 内置对 gabor 的支持 gabor:Create Gabor filter or Gabor filter bank g = gabor(wavel ...

  8. Mybatis动态建表

    在网上查了很多,都说Mybatis不支持动态建表,心凉了一节.还好找到这么一篇,找到了希望:http://www.zzzyk.com/show/ec5660d9cf1071b3.htm 经过在mysq ...

  9. Leetcode 319 Bulb Switcher 找规律

    有n盏关着的灯,第k轮把序号为k倍数的关着的灯打开,开着的灯关闭. class Solution { public: int bulbSwitch(int n) { return (int)sqrt( ...

  10. WPF内实现与串口发送数据和接收数据

    原文:WPF内实现与串口发送数据和接收数据 与串口发送数据和接收数据,在此作一个简单的Demo.此Demo可以实现按下硬件按钮,灯亮,发送灯状态数据过来.并且可以实现几个灯同时亮,发送灯的状态数据过来 ...