QTcpSocket通信编程时阻塞与非阻塞的问题
目标,qt程序作为客户端,windows下winsock作为服务器端,实现两端通信。
开始时写了一个小函数测试:
[cpp] view plain
copy
QTcpSocket tmpSock;
tcpSock.connectToHost("59.64.159.87",7716);
tcpSock.write(buf,strlen(buf)+1);
msleep(3000);
tcpSock.disconnect();
测试结果发现客户端只能连接到服务器端,而服务器端收不到客户端的消息。
初步揣测也许是Qt的socket机制使得socket缓冲队列没有即时发送。
换另一方法:
[cpp:showcolumns] view plain
copy
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
QTcpSocket tmpSock;
char* buf ="hello";
tcpSock.connectToHost("59.64.159.87",7716);
tcpSock.write(buf,strlen(buf)+1);
msleep(3000);
tcpSock.disconnect();
运行后,发现结果仍然不对。开始思考Qtsocket通信机制。想到这有可能是因为Qtcpsocket是非阻塞的方式引起的。
在网上查找,发现了一些资料。
QTcpSocket因为继承自QAbstractSocket,所以如果不采取一些措施的话,他就处于非阻塞方式,也就是事件编程,这有个好处就是可以在一个线程中实现多路tcp链接,节省资源,但是这种方式的编程难度比较大。
对于初涉这方面的朋友来说还不太适合,所有在满足要求的情况下还是阻塞方式的socket编程比较容易理解,QAbstractSocket里面提供了几个函数用于阻塞方式编程,利用好它就可以简单的编写出网络应用了:
waitForConnected() 等待链接的建立
waitForReadyRead() 等待新数据的到来
waitForBytesWritten() 等待数据写入socket
waitForDisconnected() 等待链接断开
当接收数据时,我们有个模式可以遵循:
[c-sharp] view plain
copy
while (socket.bytesAvailable() < (int)nSize) {
if (!socket.waitForReadyRead(Timeout)) {
emit error(socket.error(),
socket.errorString());
return;
}
}
这段话的主要意思就是等待nSize个数的到来,这是个一定要遵守的接收数据模板,可以把它写成一个内联函数,如果段话满足条件,就可以容read读数了。
写数的话调用write,之后调用waitForBytesWritten来确定数据是否写完。
然后修改原来的代码。
[c-sharp] view plain
copy
QTcpSocket tmpSock;
char* buf ="hello";
tcpSock.connectToHost("59.64.159.87",7716);
tcpSock.write(buf,strlen(buf)+1);
if(tcpSock.waitforreadyread(3000))
emit SockCondition("successful");
else
emit SockCondition("failed");
tcpSock.disconnect();
运行测试成功
http://blog.csdn.net/itjobtxq/article/details/8203809
QTcpSocket通信编程时阻塞与非阻塞的问题的更多相关文章
- python并发编程(并发与并行,同步和异步,阻塞与非阻塞)
最近在学python的网络编程,学了socket通信,并利用socket实现了一个具有用户验证功能,可以上传下载文件.可以实现命令行功能,创建和删除文件夹,可以实现的断点续传等功能的FTP服务器.但在 ...
- python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)
python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...
- socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别?
一.举个打电话的例子: 阻塞 block 是指,你拨通某人的电话,但是此人不在,于是你拿着电话等他回来,其间不能再用电话.同步大概和阻塞差不多. 非阻塞 nonblock 是指,你拨通 ...
- 深入 CSocket 编程之阻塞和非阻塞模式
有时,花上几个小时阅读.调试.跟踪优秀的源码程序,能够更快地掌握某些技术关键点和精髓.当然,前提是对这些技术大致上有一个了解. 我通过几个采用 CSocket 类编写并基于 Client/Server ...
- IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响—O_NONBLOCK(open使用)、IPC_NOWAIT(msgrcv)、MSG_DONTWAIT(re
非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明: 基本概念: 阻塞IO:: socket 的阻塞模式 ...
- socket编程的同步、异步与阻塞、非阻塞示例详解
socket编程的同步.异步与阻塞.非阻塞示例详解之一 分类: 架构设计与优化 简介图 1. 基本 Linux I/O 模型的简单矩阵 每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序 ...
- UNIX网络编程——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有 区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回 ...
- [转]Socket编程中,阻塞与非阻塞的区别
阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...
- Socket编程中,阻塞与非阻塞的区别
阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...
随机推荐
- 向前辈致敬 strspn
把8位的CHAR型数据分解为:前5位和后3位,这样2^5 = 32个CHAR型数+值就可表示所有的CHAR型数据 这样做的好处:在给出子串后,不用比较256次,最多比较32次即可判断出是否一个数在子串 ...
- ssh的学习
快毕业了.临走前帮导师搭建了gerrit,git服务器,其中涉及ssh的知识,就总结了下.希望对大家有帮助 一.前言(ssh出世的原因) 万物有因就有果,既然ssh存在,就必然有它存在的理由! 许多网 ...
- 数字信号处理Day1自制电子音乐
第一天的课程感觉比較简单,主要介绍Karplus-Strong Algorithm 给出方程 y[n]=αy[n−M]+x[n], x[n]是输入,M是延迟,α是衰弱系数 我们要衰减D次,总的採样数就 ...
- poj 2774 Long Long Message,后缀数组,求最长公共子串 hdu1403
题意:给出两个字符串,求最长公共子串的长度. 题解:首先将两个字符串连在一起,并在中间加一个特殊字符(字串中不存在的)切割,然后两个串的最长公共字串就变成了全部后缀的最长公共前缀.这时就要用到heig ...
- java 汉字转拼音
先决条件: pinyin4j.jar(Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换.拼音输出格式可以定制.) 下载地址:http://pan.baidu.com/share/l ...
- Android 开发笔记“调用.net webservice遇到的问题”
1.An exception occurred: org.ksoap2.SoapFault SoapFault - faultcode: 'soap:Server' faultstring: '服务器 ...
- 用PyRestful快速构建Tornado下REST APIs 的支持
一.安装PyRestful库 $ pip install pyrestful 二.使用案例 (一)books_service.py # -*- coding: utf-8 -*- import tor ...
- 二、Python-----用户交互
1.用户交互 Python 3.0的写法 name = input("Please input your name:") Python 2.0的写法 name = raw_inpu ...
- jQuery validate入门
<html> <head> <meta charset="utf8"></meta> </head> <body& ...
- SQVI和SAP查询QUERY的区别和使用注意事项
SQVI.SAP查询QUERY都适用于简单的表连接数据查询,但都不能打包传输到PRD,不同环境需要重复创建.可以生成报表程序供T-CODE调用,用se93指定事务码和程序名称. 区别1-权限: SQV ...