本帖最后由 hanzhenlll 于 2012-12-11 12:54 编辑 有朋友说,非阻塞下recv有可能接收到的数据并不完整,,,,说SELECT 有可能检测到一个字节的数据就通知可读,但是实际后面还有数据没有读完整recv就结束了.... 元芳们? 你们怎么看? 是否需要增加 recv返回值的检查... 一直到满足到需要接收字节长度大小为止?
by hanzhenlll - C/C++ - 2012-12-11 16:54:29 阅读(3530) 回复(4)
服务端Select一个socket端口,一旦有客户端的请求到来就记下accept socket句柄,并存入到一个全局数组中,以后主循环程序会扫描这个socket句柄数组,并recv每一个数组内句柄,若客户端没有send,服务端就阻塞了,我不希望他阻塞。(描述不清晰的话,望见谅) 如果不采用多线程,有其他办法吗?谢谢!
大概的代码是这样的 fcntl() //设置为非阻塞 if (connect()< 0) if (errno != EINPROGRESS) return; select(fd+ 1, NULL, &writefd, NULL, &timeout) if (FD_ISSET(fd, &writefd) { getsockopt(); } fcntl()//设置为阻塞 这样连接成功后,再调用select if (select(fd, &readfds, NULL, NULL, &timeout) > 0) { if (FD_ISSET(fd, &readfds) { recv(); } } 结果总是会在recv这里返回错误,谁能指点一下...
这几天写的一个telnet客户端类, 这个类被别的程序调用, 跟server发命令并取结果.所有的操作都不能无限时等待. 所以必须加时间控制, 可是出现了一些怪问题 程序没有设置阻塞时, 一切正常, 只是有些地方会一直等下去, 无法响应用户操作.但 1. 用setsockopt将recv的timeout设为一秒(就是SO_RCVTIMEO选项), 可以在windows下正常工作, 不过在unix下, 这句一直返回-1, error为EINTR. 我用while来一直setsockopt, 每次返回值都是这样, 而...
socket实现ftp协议客户端时
先
s = socket(AF_INET, SOCK_STREAM, 0);
sendBuf="USER "+userName+"\r\n";
//发送给服务器
send(s,sendBuf.c_str(),sendBuf.size(),0);
然后等待服务器返回信息
//接受服务器返回的信息
reLen=recv(s,buffer,100,0);
buffer[reLen]=0;
cout<<"size"<
在linux的网络编程中经常会使用非阻塞模式的socket。在阻塞模式中,对于调用connect时是阻塞的,只有当socket连接建立起来或者连接出错是connect才返回。然而在阻塞模式中connect会立即返回,至于返回后的socket句柄是否是已经建立好可用的,它是不管的。这个就需要程序员自己写代码来判断,尤其是在做多个并发连接的筛选是尤为重要。然而一般的做法是用接口函数getsockopt(int sockfd, int level, int optname, void *optval, soc...
本帖最后由 wowotoulovekk 于 2012-03-23 14:30 编辑
使用非阻塞connect同时连接2个网站,然后使用select判断是否成功,但是程序运行错误,select只能监听到第一个连接返回的数据,怀疑是select之前connect已经成功了。哪位高手能帮忙看看。[code]
/* non blocking connect to web servers*/
#include
有A,B两个台机器,运行同一个程序,程序中会用分别用IPa, IPb 和端口1521 先Listen(listen监听多个连接), 然后用非阻塞的socket 去连接对端。连接正常情况下,有两条链路,每条链路有1s的心跳检测, 10秒超时候,重新建立自己的链路(即哪条链路断开,就重建哪条)。 1) 在A上查到链路信息: channel1 :172.30.128.22:1521<-172.30.128.21:44410 channel2 :172.30.128.22:51967->172.30.128.21:1521 2)和3)都...
这是根据自己的笔记整理的,如有错误,欢迎指出来. tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据. 在阻塞模式下,send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容...
tcp协议本身是可靠的,并不等于应用程序用tcp发送数据就一定是可靠的.不管是否阻塞,send发送的大小,并不代表对端recv到多少的数据.[color="#016600"]在阻塞模式下, send函数的过程是将应用程序请求发送的数据拷贝到发送缓存中发送并得到确认后再返回.但由于发送缓存的存在,表现为:如果发送缓存大小比请求发送的大 小要大,那么send函数立即返回,同时向网络中发送数据;否则,send向网络发送缓存中不能容纳的那部分数据,并等...
深入浅出linux设备驱动之阻塞与非阻塞 刺猬@http://blog.csdn.net/littlehedgehog 注: 该系列文章转载自arm+linux chinaunix博客圈圈主之博客——http://blog.chinaunix.net/u/22630 /article_54997.html 为了适合我的编译环境,源代码有改动,但是相信我更改后的代码更加适合现在大多数读者的pc环境。 阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作。被挂起的进程进入sleep状态,...