目标,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通信编程时阻塞与非阻塞的问题的更多相关文章

  1. python并发编程(并发与并行,同步和异步,阻塞与非阻塞)

    最近在学python的网络编程,学了socket通信,并利用socket实现了一个具有用户验证功能,可以上传下载文件.可以实现命令行功能,创建和删除文件夹,可以实现的断点续传等功能的FTP服务器.但在 ...

  2. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

  3. socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别?

    一.举个打电话的例子: 阻塞   block   是指,你拨通某人的电话,但是此人不在,于是你拿着电话等他回来,其间不能再用电话.同步大概和阻塞差不多. 非阻塞   nonblock   是指,你拨通 ...

  4. 深入 CSocket 编程之阻塞和非阻塞模式

    有时,花上几个小时阅读.调试.跟踪优秀的源码程序,能够更快地掌握某些技术关键点和精髓.当然,前提是对这些技术大致上有一个了解. 我通过几个采用 CSocket 类编写并基于 Client/Server ...

  5. IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响—O_NONBLOCK(open使用)、IPC_NOWAIT(msgrcv)、MSG_DONTWAIT(re

    非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:       基本概念: 阻塞IO:: socket 的阻塞模式 ...

  6. socket编程的同步、异步与阻塞、非阻塞示例详解

     socket编程的同步.异步与阻塞.非阻塞示例详解之一  分类: 架构设计与优化 简介图 1. 基本 Linux I/O 模型的简单矩阵 每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序 ...

  7. UNIX网络编程——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

    1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有 区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回 ...

  8. [转]Socket编程中,阻塞与非阻塞的区别

    阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...

  9. Socket编程中,阻塞与非阻塞的区别

    阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...

随机推荐

  1. 原生js下拉刷新

    <!DOCTYPE html><html> <head>        <meta charset="UTF-8">         ...

  2. ASP.NET -- repeater控件的使用

    转载自网络-原网址[http://blog.csdn.net/haitaodoit/article/details/7021214] repeater绑定数据: protected void Page ...

  3. mysql 数据备份

    一.备份数据库并下载到本地[db_backup.php] php代码: <?php // 数据库参数(此处测试,直接给定,项目中使用配置文件) $cfg_dbname = 'blog'; $cf ...

  4. 记录一次webbrowser无法加载 activex 遇到的问题

    关联配置: win7 x64 Adobe Reader XI activex 安装目录X84 笔者项目运行Any CPU 无论如何也加载不出PDF 刚开始还以为自己封装的控件XWebBrowser的问 ...

  5. spring 加载配置文件的相关配置总结

    PropertyPlaceholderConfigurer      注意: Spring容器仅允许最多定义一个PropertyPlaceholderConfigurer(或<context:p ...

  6. objective-c 中随机数的用法 (3种:arc4random() 、random()、CCRANDOM_0_1() )

    1.随机数的使用      1).arc4random() 比较精确不需要生成随即种子 使用方法 : 通过arc4random() 获取0到x-1之间的整数的代码如下: int value = arc ...

  7. POJ 3784.Running Median

    2015-07-16 问题简述: 动态求取中位数的问题,输入一串数字,每输入第奇数个数时求取这些数的中位数. 原题链接:http://poj.org/problem?id=3784 解题思路: 求取中 ...

  8. JBoss 系列六十九:CDI 基本概念

    概述 如果说EJB,JPA是之前JEE(JEE5及JEE5之前)中里程碑式的规范,那么在JEE6,JEE7中CDI可以与之媲美,CDI(Contexts and Dependency Injectio ...

  9. VS2010使用DX报错 VS报错之混合模式程序集是针对“v1.1.4322”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。

    更改项目的app.config内容为以下内容 目的是开启对低版本的NETFWK支持 其实出现混合模式集的问题不只是在V1.1.4322这个版本上,在查询解决方案时发现,但凡程序集版本发生改变时,都有可 ...

  10. android-JSON解析

    构建JSON文本 方法1. // 假设现在要创建这样一个json文本 // { // "phone" : ["12345678", "87654321 ...