linux socket默认超时时间设置,Socket中如何设置连接超时 (转)

Socket中如何设置连接超时 (转)

Socket中如何设置连接超时

AntGhazi/2001.12.14 主页:antghazi.yeah

把CSDN与中文翻了底朝天,也没找到如何设置socket的连接超时的满意方法,问此问题的兄弟已有一大堆,这里偶就讲一下win下如何设置socket的connect超时。

设置connect的超时很简单,CSDN上也有人提到过使用,但却没有一个令人满意与完整的答案。偶所讲的也正是select,此函数集成在winsock1.1中,简单点讲,"作用使那些想避免在套接字过程中被锁定的应用,采取一种有序的方式,同时对多个套接字进行管理"(《技术》原话)。使用方法与解释请见《Windows网络编程技术》。

在使用此函数前,需先将socket设置为非锁定,这样,在connect时,才会立马跳过,同时,通常也会产生一个WSAEWOULLOCK错误,这个错误没关系。再select则是真正的超时。

WSADATA wsd;

SOCKET cClient;

int ret;

struct sockaddr_in server;

hostent *host=NULL;

if(Wtartup(MAKE(2,0),&wsd)){return 0;}

cClient=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

if(cClient==INVALID_SOCKET){return 0;}

//set Recv and Send time out

int TimeOut=6000; //设置发送超时6秒

if(::setsockopt(cClient,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){

return 0;

}

TimeOut=6000;//设置接收超时6秒

if(::setsockopt(cClient,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR){

return 0;

}

//设置非阻塞方式连接

unsigned long ul = 1;

ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul);

if(ret==SOCKET_ERROR)return 0;

//连接

server.sin_family = AF_INET;

server.sin_port = htons(25);

server.sin_addr .s_addr =_addr((LPCSTR)pSmtp);

if(server.sin_addr.s_addr == INADDR_NONE){return 0;}

connect(cClient,(const struct sockaddr *)&server,sizeof(server));

//select 模型,即设置超时

struct timeval timeout ;

fd_set r;

FD_ZERO(&r);

FD_SET(cClient, &r);

timeout.tv_sec = 15; //连接超时15秒

timeout.tv_usec =0;

ret = select(0, 0, &r, 0, &timeout);

if ( ret <= 0 )

{

::closesocket(cClient);

return 0;

}

//一般非锁定模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式

unsigned long ul1= 0 ;

ret = ioctlsocket(cClient, FIONBIO, (unsigned long*)&ul1);

if(ret==SOCKET_ERROR){

::closesocket (cClient);

return 0;

}

如有不明或错误的地方,欢迎指正.

to:antghazi@163.net">mailto:antghazi@163.net

AntGhazi/2001.12.14

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 常用的软件包管理器/软件包管理工具详解

文章目录RPM 是什么&#xff1f;应用于哪些系统RPM 的前端工具有哪些RPM 包命名规范RPM 安装软件的默认路径RPM 安装原理图RPM 命令详解YUM 是什么&#xff1f;应用于哪些系统YUM 原理说明主要特点YUM 和 RPM 的区别YUM 命令详解DNF 是什么应用于哪些系统DNF 命令详解APT 是什么…

java world_Java World中的GraphQL简介

java world许多人认为GraphQL仅适用于前端和JavaScript&#xff0c;它在Java等后端技术中不占优势&#xff0c;但事实确实如此。 还经常将GraphQL与REST进行比较&#xff0c;但是这种比较是否合理&#xff1f; 首先&#xff0c;让我开始回答其中最重要的问题。 什么是GraphQL…

快速排序 动图_Java十大排序算法最强总结

看到一篇很不错的文章&#xff0c;不多说&#xff0c;看吧排序算法说明0.1 排序的定义对一序列对象根据某个关键字进行排序。0.2 术语说明稳定&#xff1a;如果a原本在b前面&#xff0c;而ab&#xff0c;排序之后a仍然在b的前面&#xff1b;不稳定&#xff1a;如果a原本在b的前…

linux安装2870无线网卡,ubuntu15.04安装usb无线网卡

一般这种无线网卡都是联fake芯片&#xff0c;我使用的ralin(你懂的k)的usb无线1150 M。你去找lei凌官网找不到&#xff0c;只能去找芯片类型的制造者&#xff0c;所以只能去联Fake官网查询下载对应型号。1、我是这样子查看型号的&#xff0c;找到通过驱动软件检测并已经安装成功…

Linux 应用程序的源码包如何安装?

文章目录configuremakemake install关于文件 configure 的简单介绍其它命令简介C 语言开发的应用程序的源码包常以 .tar.gz 为扩展名&#xff0c;并且这些源码包通常使用 GNU 的 AUTOCONF 和 AUTOMAKE 生成编译配置文件&#xff0c;我们拿到这样的软件包后&#xff0c;执行下面…

exec su-exec_WildFly Kubernetes exec探针

exec su-exec活动性和就绪性探针会告诉Kubernetes&#xff0c;某个Pod是否正在运行并准备进行一些工作。 企业应用程序可以通过HTTP探测应用程序的状态。 如果没有暴露HTTP端点&#xff0c;Kubernetes也可以通过执行命令进行探测。 WildFly附带了有用的jboss-cli.sh 。 此CLI检…

feignclient注解使用_从 Feign 使用注意点到 RESTFUL 接口设计规范

最近项目中大量使用了Spring Cloud Feign来对接http接口&#xff0c;踩了不少坑&#xff0c;也产生了一些对RESTFUL接口设计的想法&#xff0c;特此一篇记录下。SpringMVC的请求参数绑定机制了解Feign历史的朋友会知道&#xff0c;Feign本身是Netflix的产品&#xff0c;Spring …

Linux 的发行版 Ubuntu 的发展简史

Ubuntu&#xff08;又称乌班图&#xff09;是一个是基于 Debian GNU/Linux 的以桌面应用为主的免费开源的 GNU/Linux 操作系统&#xff0c;由全球化的专业开发团队 Canonical 公司打造的。 Ubuntu Linux 是由南非人马克沙特尔沃思(Mark Shuttleworth)创办的基于 Debian Linux的…

linux实验报告五gcc编译,Linux之GCC命令 -- 解析GCC编译的四个过程

在Linux下进行C语言编程&#xff0c;必然要采用GNU GCC来编译C源代码生成可执行程序。Gcc指令的一般格式为&#xff1a;Gcc [选项] 要编译的文件 [选项] [目标文件]。其中&#xff0c;目标文件可缺省&#xff0c;Gcc默认生成可执行的文件名为&#xff1a;编译文件.out看一下经典…

python创建虚拟环境命令_Python创建虚拟环境报错

我使用命令&#xff1a;mkvirtualenv -p python3 test1,创建虚拟环境&#xff0c;然后报错如下()&#xff0c;虚拟机是用nat模式的: Exception: Traceback (most recent call last): File "/home/python/.virtualenvs/test11/share/python-wheels/urllib3-1.13.1-py2.py3-…

java7和java8切换_切换表达式到Java吗?

java7和java8切换已创建一个标题为“ Java语言的开关表达式”的JEP草案 。 当前的“摘要”状态为&#xff1a;“扩展switch语句&#xff0c;以便可以将其用作语句或表达式&#xff0c;并改善switch处理null的方式。 这些将简化日常编码&#xff0c;并为在switch使用模式匹配做好…

Xenix 操作系统的简史

简介 Xenix 是一种UNIX操作系统&#xff0c;可在个人电脑及微型计算机上使用。该系统由微软公司在1979年从美国电话电报公司获得授权&#xff0c;为Intel处理器所开发。后来&#xff0c;圣克鲁兹作业公司&#xff08;SCO&#xff09;收购了其独家使用权&#xff0c;自那以后&a…

servlet 配置 使用_配置HTTPS以与Servlet一起使用

servlet 配置 使用要配置Java EE应用程序以通过HTTPS进行通信&#xff0c;需要在web.xml文件中使用几行XML。 web.xml文件位于项目的WEB-INF目录中&#xff0c;通常在IDE生成Java EE Web应用程序时自动创建。 如果不是&#xff0c;您可以自己创建它。 HTTPS的动机 为Web应用程…

python写接口测试代码_python写运单接口测试(增改查)完整代码

importrequestsimportjsonfrom urllib importparseclassHttpWayBillRquest:运单的增改查 defaccess_token(self):获取tokenurl http://xxxxxxxxx.comusername 12333password 12334566res_json requests.get(url, auth(username, password)).json()print(access_token的结果为&a…

linux终端cd未找到命令,为什么`which`命令不能用于`cd`?我也找不到`cd`的可执行文件!...

问题描述我尝试了which cd&#xff0c;它没有给出路径&#xff0c;而是返回退出代码1(用echo $?检查)。 coreutil cd本身正在工作&#xff0c;所以可执行文件应该在那里&#xff0c;对吧&#xff1f;我还为cd运行了find&#xff0c;但没有显示可执行文件。那怎么实现呢&#x…

Xenix — 微软与UNIX的短暂爱恋

微软向外宣布Microsoft Xenix OS&#xff0c;一个为16位微处理器开发的可移植的操作系统。它是一个交互的&#xff0c;多用户多任务系统&#xff0c;可以运行在Intel 8086, Zilog Z8000, Motorola M68000以及DEC公司的PDP-11系统计算机上。所有微软已经开发的系统软件&#xff…

optionals_Java Optionals获得更具表现力的代码

optionals我们中任何使用允许空引用的语言进行编程的人&#xff0c;都将在尝试取消引用一个引用时经历过。 无论是导致segfault还是NullPointerException&#xff0c;它始终是一个错误。 托尼霍尔将其描述为他十亿美元的错误 。 当函数向客户端的开发人员未预料到的客户端返回空…

python排序sorted_sorted排序的两个方法 - Python

在给列表排序时&#xff0c;sorted非常好用&#xff0c;语法如下&#xff1a; sorted(iterable[, cmp[,key[,reverse]]]) 简单列表排序&#xff0c;很容易完成&#xff0c;sorted(list)返回的对象就是列表结果&#xff0c;但是遇到列表中嵌套元组时&#xff0c;需要使用特殊的方…

linux vim自动执行快捷键,Linux Vim快捷键操作命令整理

VIM中常用的替换模式总结1&#xff0c;简单替换表达式替换命令可以在全文中用一个单词替换另一个单词&#xff1a;:%s/four/4/g“%” 范围前缀表示在所有行中执行替换。最后的 “g” 标记表示替换行中的所有匹配点。如果仅仅对当前行进行操作&#xff0c;那么只要去掉%即可如果…

Mach 微内核的命名趣闻

据 Tevanian 说&#xff0c;MACH&#xff0c;源于一个读音错误。当时他正和其他人在匹兹堡一个下雨天里一边躲避着路上的泥水坑&#xff0c;一边讨论着新内核的事&#xff0c;Tevanian开玩笑地建议他们的新微核命名为MUCK&#xff0c;意为“多用户通信内核”&#xff08;Multi-…