VC++ 用setsockopt()来控制recv()与send()的超时
在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制:
以下是来自于网上一篇文章中的摘录,它是这样写的:
int nNetTimeout=1000;//1秒,
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
有两点注意就是:
1)recv ()的第四个参数需为MSG_WAITALL(设置MSG_DONTWAIT可以不用阻塞在建立连接后在等等接收数据),在阻塞模式下不等到指定数目的数据不会返回,除非超时时间到。还要注意的是只要设置了接收超时,在没有MSG_WAITALL时也是有效的。说到底超时就是不让你的程序老在那儿等,到一定时间进行一次返回而已。
2)即使等待超时时间值未到,但对方已经关闭了socket, 则此时recv()会立即返回,并收到多少数据返回多少数据。
int rst;
int nNetTimeout = nTimeOut;//1秒,
SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(wIpAddr);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port =htons(nPort);
setsockopt(sockClient, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeof(int));
rst = connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
if (rst != 0)
{
return 0;
} setsockopt(sockClient, SOL_SOCKET, SO_SNDTIMEO, (char *)&nNetTimeout, sizeof(int));
send(sockClient, "1", 3, 0);//最后一位 为0 是默认值
char recvbuf[4];
memset(recvbuf, 0, 4);
setsockopt(sockClient, SOL_SOCKET, SO_RCVTIMEO, (char *)&nNetTimeout, sizeof(int));
recv(sockClient, recvbuf, 100, 0);
closesocket(sockClient); if (recvbuf[0] == 'C' && recvbuf[1] == 'D')
{
return 1;
}
else
{
return 0;
}
VC++ 用setsockopt()来控制recv()与send()的超时的更多相关文章
- setsockopt()用法(参数详细说明) recv、send的超时处理
源于recv send 阻塞和非阻塞 int setsockopt(SOCKET s,int level,int optname,const char* optval,int optlen); s(套 ...
- UNIX网络编程-recv、send、read、write之间的联系与区别
1.read ----------------------------------------------------------------------- #include <unistd.h ...
- linux中read,write和recv,send的区别
linux中read,write和recv,send的区别 1.recv和send函数提供了和read和write差不多的功能.但是他们提供了第四个参数来控制读写操作. int recv(int so ...
- UNIX网络编程读书笔记:recv和send函数
这两个函数类似于标准的read和write函数,不过需要一个额外的参数. #include <sys/socket.h> ssize_t recv(int sockfd, void *bu ...
- 一种构造WEB服务器端recv和send接口阻塞现象的方法
send阻塞 socket recv send接口阻塞,会导致服务器端不在响应客户端任何请求,所以一般情况, 会将socket设置为非阻塞状态, 但是有些场景,例如ssl_accept就需要使用阻塞的 ...
- recv和send函数
转自 http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html 1. send解析 sockfd:指定发送端套接字描述符. bu ...
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值(转载)
1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值 ...
- 【收藏】socket 中的 recv与send函数
收藏自世道:http://www.cnblogs.com/jianqiang2010/archive/2010/08/20/1804598.html 1.send 函数 int send( SOCKE ...
- UNIX网络编程——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有 区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回 ...
随机推荐
- 部分用到的python代码
replace file extensions # change .htm files to .html for file in *.htm ; do mv $file `echo $file | s ...
- 创建Windows截图工具的快捷方式
日常生活中我们会用到好多截图,一般截图我们用QQ自带截图较多,但许多人都忽视了电脑自带截图功能.在我的电脑-->附件-->截图工具 按照上述方式找截图工具比较繁琐,今天我们可以通过快捷 ...
- linux 启动weblogic的某服务报错
问题如标题所示, 错误信息主要包括: weblogic.store.PersistentStoreException: [Store:280073]The file store"WLS_DI ...
- Ubuntu Gnome16.04下安装cuda、theano和opencv
1. 安装显卡驱动 ~$ lspci | grep controller00:02.0 VGA compatible controller: Intel Corporation Sky Lake In ...
- linux项目-之系统安装部署-cobbler
http://cobbler.github.io/manuals/2.6.0/1/1_-_Release_Notes.html http://www.osyunwei.com/archives/760 ...
- Yii2.0中文开发向导——Yii2中多表关联查询(join、joinwith)
我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_ ...
- Nginx日志导入到Hive0.13.1,同步Hbase0.96.2,设置RowKey为autoincrement(ID自增长)
---------------------------------------- 博文作者:迦壹 博客地址:Nginx日志导入到Hive,同步Hbase,设置RowKey为autoincrement( ...
- c++读写二进制文件
要读取文件必须包含<fstream>头文件,这里包含了C++读写文件的方法,可以使用fstream 类,这个类可以对文件进行读写操作. 1.打开文件. 打开文件可以有两种方式,第一 ...
- asp 实现域名转向
<% host=lcase(request.servervariables("HTTP_HOST")) select CASE host CASE "aa.cn&q ...
- json_encode和json_decode
<?php $json = '{"a":1,"b":2,"c":3,"d":4,"e":5}' ...