QSocket类提供了一个有缓冲的TCP连接。 详情请见……

#include <qsocket.h>

继承了QObjectQIODevice

所有成员函数的列表。

公有成员

  • enum Error { ErrConnectionRefused, ErrHostNotFound, ErrSocketRead }
  • QSocket ( QObject * parent = 0, const char * name = 0 )
  • virtual ~QSocket ()
  • enum State { Idle, HostLookup, Connecting, Connected, Closing, Connection = Connected }
  • State state () const
  • int socket () const
  • virtual void setSocket ( int socket )
  • QSocketDevice * socketDevice ()
  • virtual void setSocketDevice ( QSocketDevice * device )
  • virtual void connectToHost ( const QString & host, Q_UINT16 port )
  • QString peerName () const
  • virtual bool open ( int m )
  • virtual void close ()
  • virtual void flush ()
  • virtual Offset size () const
  • virtual Offset at () const
  • virtual bool at ( Offset index )
  • virtual bool atEnd () const
  • Q_ULONG bytesAvailable () const
  • Q_ULONG waitForMore ( int msecs ) const
  • Q_ULONG bytesToWrite () const
  • virtual Q_LONG readBlock ( char * data, Q_ULONG maxlen )
  • virtual Q_LONG writeBlock ( const char * data, Q_ULONG len )
  • virtual int getch ()
  • virtual int putch ( int ch )
  • virtual int ungetch ( int ch )
  • bool canReadLine () const
  • virtual QString readLine ()
  • Q_UINT16 port () const
  • Q_UINT16 peerPort () const
  • QHostAddress address () const
  • QHostAddress peerAddress () const

信号

保护槽


详细描述

QSocket类提供了一个有缓冲的TCP连接。

它提供一个完全非阻塞的QIODevice,使用套接字特征代码来修改和扩展了QIODevice的应用编程接口。

你和可能常常调用的connectToHost()、bytesAvailable()、canReadLine()这些函数并且它们继承了QIODevice。

connectToHost()是一个最常用的函数。就像它的名字那样,它打开一个被命名的主机的连接。

绝大多数网络协议是基于包的或者基于行的。canReadLine()可以识别一个连接中是否包含一个完全不可读的的行,并且bytesAvailable()返回可以被读取的字节数量。

信号error()、connected()、readyRead()和connectionClosed()通知你连接的进展。还有一些不太常用的信号。当connectToHost()已经完成它的DNS查找并且正在开始它的TCP连接时,hostFound()被发射。当close()成功时,delayedCloseFinished()被发射。当QSocket把它的“写”队列中的数据移到TCP运行中。

还有几个套接字的访问函数:state()返回这个对象是否空闲,是否正在做DNS查找,是否正在连接,还是一个正在操作的连接,等等。address()和port()返回连接所使用的IP地址和端口。peerAddress()和peerPort()函数返回自身所用到的IP地址和端口并且peerName()返回自身所用的名称(通常是被传送给connectToHost()的名字)。socket() 返回这个套接字所用到的QSocketDevice的指针。

QSocket继承了QIODevice并且重新实现了一些函数。通常你可以把它作为QIODevice来写,并且绝大多数情况也可以作为QIODevice来读。但匹配的不够完美,因为QIODevice应用编程接口是为同一个机器可以控制的设备而设计的,而异步的端对端网络连接和这个不太一样。例如,没有什么可以和QIODevice::size()确切地匹配。open()、close()、flush()、size()、at()、atEnd()、readBlock()、writeBlock()、getch()、putch()、ungetch()和readLine()的文档详细地描述了不同点。

也可以参考QSocketDeviceQHostAddressQSocketNotifier输入/输出和网络


成员类型文档

QSocket::Error

这个枚举变量指定了可能的错误:

  • QSocket::ErrConnectionRefused - 如果连接被拒绝
  • QSocket::ErrHostNotFound - 如果主机没有被找到
  • QSocket::ErrSocketRead - 如果读取套接字失败

QSocket::State

这个枚举变量定义了连接状态:

  • QSocket::Idle - 如果没有连接
  • QSocket::HostLookup - 在DNS查找期间
  • QSocket::Connecting - 在TCP连接建立期间
  • QSocket::Connected - 当存在一个可操作的连接时
  • QSocket::Closing - 如果这个套接字正在关闭,但是还没有被关闭。

成员函数文档

QSocket::QSocket ( QObject * parent = 0, const char * name = 0 )

创建一个QSocket::Idle状态的QSocket对象。

parentname参数被传递给QObject的构造函数。

QSocket::~QSocket () [虚]

销毁这个套接字。如果需要关闭连接。

也可以参考close()。

QHostAddress QSocket::address () const

返回这个套接字的主机地址。(这通常就是主机的主IP地址,但是对于到localhost的连接可能是127.0.0.1。)

Offset QSocket::at () const [虚]

返回当前的读索引。因为QSocket是一个顺序设备,当前读索引总是0。

Reimplemented from QIODevice.

bool QSocket::at ( Offset index ) [虚]

这是一个重载成员函数,提供了方便。它的行为基本上和上面的函数相同。

向前移动读索引到index并且如果操作成功返回真。向前移动读索引意味着忽略进入的数据。

QIODevice中重新实现的。

bool QSocket::atEnd () const [虚]

如果没有更多的数据可以读取,返回真,否则返回假。

QIODevice中重新实现的。

Q_ULONG QSocket::bytesAvailable () const

返回可以读取的进入数据的字节数,也就是输入缓存的大小。等于size()。

也可以参考bytesToWrite()。

实例:network/networkprotocol/nntp.cpp

Q_ULONG QSocket::bytesToWrite () const

返回正在等待被写的数据的字节数,也就是输出缓存的大小。

也可以参考bytesAvailable()。

void QSocket::bytesWritten ( int nbytes ) [信号]

当数据被实际写到网络时,这个信号被发射。nbytes参数指定了多少字节被写了。

bytesToWrite()函数常常会在相同的上下文中被使用,并且它说明了还有多少数量的缓存字节数要写。

也可以参考writeBlock()和bytesToWrite()。

bool QSocket::canReadLine () const

如果这一次可以从这个套接字中读取一个完整行的文本,返回真,否则返回假。

注意如果本地出乎意料地关闭连接,这个函数返回假。这也就是说这样的循环不会工作:

    while( !socket->canReadLine() ) // 错了。
...

也可以参考readLine()。

实例:network/clientserver/client/client.cppnetwork/httpd/httpd.cppnetwork/mail/smtp.cppnetwork/networkprotocol/nntp.cpp

void QSocket::close () [虚]

关闭这个套接字。

读缓存被清空。

如果输出缓存是空的,状态被设置为QSocket::Idle并且连接被立即终止。如果输出缓存中还有数据要写,QSocket进入QSocket::Closing状态并且等待这些数据被写完。当所有的输出数据被写完,状态被设置为QSocket::Idle并且连接被终止。在这时,delayedCloseFinished() 喜好被发射。

也可以参考state()和bytesToWrite()。

实例:network/clientserver/client/client.cppnetwork/httpd/httpd.cppnetwork/networkprotocol/nntp.cpp

QIODevice中重新实现的。

void QSocket::connectToHost ( const QString & host, Q_UINT16 port ) [虚]

试图连接主机host的指定端口port并且立即返回。

任何连接或者正在进行的连接被立即关闭,并且QSocket进入HostLookup 状态。当查找成功,它发射hostFound(),开始一个TCP连接并且进入Connecting状态。最后,当连接成功时,它发射connected()并且进入Connected状态。如果在任何一个地方出现错误,它发射error()。

host可以是一个字符串形式的IP地址,也可以是一个DNS名称。如果需要QSocket将会进行一个普通的DNS查找。注意port是本地字节顺序,不像其它库那样。

也可以参考state()。

实例:network/clientserver/client/client.cppnetwork/mail/smtp.cppnetwork/networkprotocol/nntp.cpp

void QSocket::connected () [信号]

connectToHost()已经被调用并且连接已经被成功建立之后,这个信号被发射。

也可以参考connectToHost()和connectionClosed()。

实例:network/clientserver/client/client.cppnetwork/mail/smtp.cppnetwork/networkprotocol/nntp.cpp

void QSocket::connectionClosed () [信号]

当另一端已经关闭这个连接时,这个信号被发射。在连接被关闭之后,读缓存中也许还包含被可读的缓存的输入数据。

也可以参考connectToHost()和close()。

实例:network/clientserver/client/client.cppnetwork/networkprotocol/nntp.cpp

void QSocket::delayedCloseFinished () [信号]

当一个延时的关闭被完成时,这个信号被发射。

如果你调用close()并且输出缓存中还有数据要写,QSocket进入QSocket::Closing状态并且立即返回。然后它将会继续要套接字写知道所有的数据被写完。然后,delayedCloseFinished()信号被发射。

也可以参考close()。

实例:network/clientserver/client/client.cppnetwork/httpd/httpd.cpp

void QSocket::error ( int ) [信号]

在错误发生之后,信号被发射。参数就是Error的值。

实例:network/clientserver/client/client.cppnetwork/networkprotocol/nntp.cpp

void QSocket::flush () [虚]

纯虚函数QIODevice::flush()的实现。

QIODevice中重新实现的。

int QSocket::getch () [虚]

从内部的读缓存中读取单一的字节/字符。返回读取的字节/字符,或者如果没有什么可以读取的,返回-1。

也可以参考bytesAvailable()和putch()。

QIODevice中重新实现的。

void QSocket::hostFound () [信号]

connectToHost()已经被调用并且主机查找已经成功之后,这个信号被发射。

也可以参考connected()。

实例:network/networkprotocol/nntp.cpp

bool QSocket::open ( int m ) [虚]

使用指定的QIODevice文件模式m打开套接字。当被需要的时候会被自动调用并且你不应该自己调用它。

也可以参考close()。

QIODevice中重新实现的。

QHostAddress QSocket::peerAddress () const

返回为connectToHost()函数指定名称的主机地址。

QString QSocket::peerName () const

返回为connectToHost()函数指定主机名称。如果没有被设置,返回一个空字符串。

实例:network/mail/smtp.cpp

Q_UINT16 QSocket::peerPort () const

返回本地的主机端口号,通常是为connectToHost()函数指定的。如果没有被设置,返回0。

注意Qt总是使用本地字节顺序,也就是在Qt中67就是67,不需要调用htons()。

Q_UINT16 QSocket::port () const

返回这个套接字的主机端口号,使用本地字节顺序。

int QSocket::putch ( int ch ) [虚]

写字符ch到输出缓存。

返回ch,或者如果发生错误,返回-1。

也可以参考getch()。

QIODevice中重新实现的。

Q_LONG QSocket::readBlock ( char * data, Q_ULONG maxlen ) [虚]

从套接字中读取最多maxlen字节到data中并且返回读取的字节数。如果发生错误,返回-1。

实例:network/networkprotocol/nntp.cpp

QIODevice中重新实现的。

QString QSocket::readLine () [虚]

返回包含终止新行符(\n)的一行文本。如果canReadLine()返回假,返回“”。

也可以参考canReadLine()。

实例:network/clientserver/client/client.cppnetwork/httpd/httpd.cppnetwork/mail/smtp.cppnetwork/networkprotocol/nntp.cpp

void QSocket::readyRead () [信号]

当有进入的数据可以被读取时,这个信号被发射。

每一次有新进入的数据时,这个信号都被发射一次。记住新进入的数据只被报告一次,也就是,如果你没有读取全部数据,这个信号不会被再次发射,除非新的数据到达这个套接字。

也可以参考readBlock()、readLine()和bytesAvailable()。

实例:network/clientserver/client/client.cppnetwork/httpd/httpd.cppnetwork/mail/smtp.cppnetwork/networkpotocol/nntp.cpp

void QSocket::setSocket ( int socket ) [虚]

设置套接字使用socket并且state()为Connected。这个套接字应该已经被连接。

这允许我们使用QSocket类作为一个其它套接字类型(也就是在Unix下的Unix领域套接字)的包装。

实例:network/httpd/httpd.cpp

void QSocket::setSocketDevice ( QSocketDevice * device ) [虚]

设置内部套接字设备为device。传递一个0的device将导致这个内部套接字设备被使用。在使用新的device之前,任何已经存在的连接将被取消连接。

新的设备在被关联到一个QSocket之前应该没有被连接,在设置套接字调用connectToHost()之后进行连接。

如果你继承QSocketDevice并且想使用QSocket应用编程接口,例如,实现Unix领域套接字,这个函数很有用。

Offset QSocket::size () const [虚]

立即返回可以读取的进入数据的字节数(就像bytesAvailable()一样)。

QIODevice中重新实现的。

void QSocket::sn_read ( bool force = FALSE ) [虚 保护 槽]

处理套接字读通知的内部槽。

这个函数通常只能被进入一次(也就是,不是递归调用)。如果参数force为真,这个函数被执行,但是没有readyRead()信号被发射。这种方式对于waitForMore()函数很有用,所以在一个连接到readyRead()信号的槽中调用waitForMore()是可能的。

void QSocket::sn_write () [虚 保护 槽]

处理套接字写通知的内部操。

int QSocket::socket () const

返回套接字数,或者如果这个时候没有套接字,返回-1。

QSocketDevice * QSocket::socketDevice ()

返回内部套接字设备的指针。

通常不需要直接操作这个套接字设备,因为这个类对于绝大多数应用程序不需要设置。

State QSocket::state () const

返回这个套接字连接的当前状态。

也可以参考QSocket::State

实例:network/clientserver/client/client.cppnetwork/networkprotocol/nntp.cpp

int QSocket::ungetch ( int ch ) [虚]

虚函数QIODevice::ungetch()的实现预先考虑写缓存中的字符ch,这样下一次读取把这个字符作为输出的第一个字符。

QIODevice中重新实现的。

Q_ULONG QSocket::waitForMore ( int msecs ) const

为了得到更多的可用数据,等待msecs毫秒。

如果msecs为-1,这个调用将会不确定地阻塞。

这个一个阻塞调用并且应该在事件驱动的应用程序中避免使用。

返回可以使用的字节数。

也可以参考bytesAvailable()。

Q_LONG QSocket::writeBlock ( const char * data, Q_ULONG len ) [虚]

data中向套接字中写入len字节并且返回所写的字节数。如果发生错误,返回-1。

实例:network/networkprotocol/nntp.cpp

QIODevice中重新实现的。

转自:http://www.kuqin.com/qtdocument/qsocket.html

QSocket类的更多相关文章

  1. Java类的继承与多态特性-入门笔记

    相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...

  2. QDataStream类参考(串行化数据,可设置低位高位,以及版本号),还有一个例子

    QDataStream类提供了二进制数据到QIODevice的串行化. #include 所 有成员函数的列表. 公有成员 QDataStream () QDataStream ( QIODevice ...

  3. QSocket 总体设计框架说明(观赏)

    QSocket 是 QDAC 开源组件的一个重要的组成部分,终于要开始开工了,为了方便大家了解 QSocket,对 QSocket 的总体设计的一些想法,我在这里给大家简要的描述一下. 首先,QSoc ...

  4. C++ 可配置的类工厂

    项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...

  5. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  6. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  7. ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core

    背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...

  8. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  9. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

随机推荐

  1. 如何安全的下载Devcon.exe文件

    devcon.exe是windows设备管理器的命令行版本,可以让你在cmd中修改设备,但是微软没有提供单独的下载,只能下载一个2G多的wdk包(windows drive kits)才行.私下使用别 ...

  2. IOS 启动画面和图标设置(适配IOS7 and Xcode5)

    关于IOS程序设置启动画面以及图标的设备目前主要为:IPhone设备 和IPad设备 IPhone启动画面以及图标的设置 目前IPhone的分辨率为:320X480.640X960.640X1136. ...

  3. Codeforces Round #Pi (Div. 2)(A,B,C,D)

    A题: 题目地址:Lineland Mail #include <stdio.h> #include <math.h> #include <string.h> #i ...

  4. android studio : clang++.exe: error: invalid linker name in argument '-fuse-ld=bfd

    公司jenkins上的C++编译器最近换成了clang,今天更新了代码发现本地的C/C++代码用NDK编译不过了,提示: “clang++.exe: error: invalid linker nam ...

  5. 36氪首发 | 「myShape」完成千万级人民币 Pre-A轮融资,推出 AI 智能健身私教

    无需任何可穿戴设备. 36氪获悉,myShape(原Shapejoy)已于近期完成千万级人民币的Pre-A轮融资,由天奇阿米巴领投,远洋集团.七熹资本以及老股东跟投.过去 myShape 曾获得元迅资 ...

  6. (原创)谈谈boost.asio的异步发送

    在上一篇博文中提到asio的异步发送稍微复杂一点,有必要单独拿出来说说.asio异步发送复杂的地方在于: 不能连续调用异步发送接口async_write,因为async_write内部是不断调用asy ...

  7. DIOCP开源项目-DIOCP3直接发送对象,帮你处理粘包问题

    该DEMO演示,如何在客户端与服务端之间直接传递TStream对象,让你专注于处理数据逻辑,可以忽略处理网络传输间粘包的问题. 上面由服务端向所有的客户端推送一个消息TMemoryStream对象(该 ...

  8. jdango 部署之nginx+uwsgi

    1,安装pip sudo apt-get install python-pip 2,利用 pip 安装 Django sudo pip install Django 3,检测Django是否安装成功 ...

  9. Python nose单元测试框架的安装与使用

    [本文出自天外归云的博客园] 安装(Python2下安装) pip install nose 原理与命名规则 Nose会自动查找源文件.目录或者包中的测试用例,符合正则表达式(?:^|[\b_\.%s ...

  10. repo常用指令

    下载 repo 的地址: http://android.git.kernel.org/repo ,可以用 wget http://android.git.kernel.org/repo 或者 curl ...