套接字I/O超时设置的方法

用select实现超时

1.read_timeout函数封装

2.write_timeout

3.accept_timeout

4.connect_timeout

套接字I/O超时设置方法

1.ararm

第一种:

SIGALRM

void handler(int sig)

{

return 0;

}

signal(SIGLRM,handler);

alarm(5);

int ret =read(fd,buf,sizeof(buf));

if(ret== -1&&errno == EINET)

{

  errno = ETIMEOUT;

}else if (ret>=0)

{

  alarm(0);

}

第二种

sctsockopt(sock, SOL_SOCKET, SO_RECVTIMEO,5);

int ret = read(sock, buf, sizeof(buf));

if(ret == -1&&errno = EWOULLBLOCK)

{

errno = ETIMEOUT;

}// 有些时候不支持

2.套接字选项

1)  SO_SNDTIMEO

2)  SO_RCVTIMEO

a)  read_timeout(int fd,  unsigned int wait_seconds )

逻辑: 读超时检测函数(不含读操作)

       成功(未超时),返回0;

       失败 /超时-1 且 errno = ETIMEOUT;

int ret = read_timeout(fd, 5);

if (ret ==0)

{

read(fd...);

}

else if(ret==-1)

{

timeout...

}else

{

ERR_EXIT("read_timeout");

}

b)  write_timeout 同理(不含写操作)

c)  accept_timeout 带超时的accept

成功返回已连接的套接字,超市返回-1且errno = ETIMEOUT

accept_timeout (int fd , struct sockaddr_in  *addr. unsigned int wait_seconds)

d)connect-timeout

connect_timeout (int fd, struct sockaddr_in *addr, unsigned int wait_seconds)

addr: 要连接的对方的地址

成功返回0 , 失败返回-1且errno = ETIMEOUT

如果waite_seconds>0就改成非阻塞模式,调用connect_timeout

获取错误信息:调用getsockopt()

int err;

socklen_t socklen = sizeof(err);

int  sockoptret = getsockopt(fd , SOL_SOCKET, SO_ERROR, &err, &socklen);

if (sockoptret == -1)

return -1;

if(err ==0)

ret=0;

else

{

errno =err;

ret =-1;

}

最后处理完成还要返回ret 的值

原文地址:https://www.cnblogs.com/Begin-Again/p/12571023.html

时间: 2024-08-05 14:16:31

套接字I/O超时设置的方法的相关文章

PHP Socket(套接字连接)扩展简介和使用方法

PHP socket扩展是基于流行的BSD sockets,实现了和socket通讯功能的底层接口,它可以和客户端一样当做一个socket服务器. 使用这些函数时请注意,虽然他们中有很多和C函数同名的,但声明却很可能不同.未避免混淆,请仔细阅读函数描述. 不熟悉socket编程的可以在Unix手册上找到很多有用的信息,网上也有很多C socket编程方面的教程,简单修改一下就可以应用于PHP socket编程. 第一步:开启socket 到php.ini开启extension=php_socke

TCP/IP网络编程之套接字类型与协议设置

套接字与协议 如果相隔很远的两人要进行通话,必须先决定对话方式.如果一方使用电话,另一方也必须使用电话,而不是书信.可以说,电话就是两人对话的协议.协议是对话中使用的通信规则,扩展到计算机领域可整理为"计算机间对话必备通信规则" 在TCP/IP网络编程之网络编程和套接字这一章中,我们已经介绍了如何创建套接字,但为了完全理解该函数,此处将继续展开讨论 #include <sys/socket.h> int socket(int domain, int type, int pr

【TCP/IP网络编程】:02套接字类型与协议设置

本篇文章主要介绍创建套接字函数相关的3个输入参数的含义,它们最终确定了套接字通信所采用的协议.同时,也简单对比了TCP和UDP传输方式的区别. 什么是协议?协议是对话中使用的通信规则,而在计算机领域则可解释为“计算机间对话的通信规则”.简言之,协议就是为了完成数据交换而约定的规则. //创建套接字 #include <sys/socket.h> int socket(int domain, int type, int protocol); -> 成功时返回文件描述符,失败时返回-1 do

使用SO_RCVTIMEO套接字选项为recvfrom设置超时

1 #include"apue.h" 2 void do_cli(FILE* fp,int sockfd,const (SA*)pserveraddr,socklen_t len) 3 { 4 char sendbuf[maxlen],recvbuf[maxlen]; 5 int n; 6 struct timeval tv; 7 tv.tv_sec=5;tv.tv_usec=0; 8 setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&tv,s

使用SO_REVTIMEO套接字选项为recvfrom设置超时

void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) { int n; char sendline[MAXLINE], recvline[MAXLINE + 1]; struct timeval tv; tv.tv_sec = 5; tv.tv_usec = 0; setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); while (f

Unix网络编程 高级IO套接字设置超时

我们知道,对于一个套接字的读写(read/write)操作默认是阻塞的,如果当前套接字还不可读/写,那么这个操作会一直阻塞下去,这样对于一个需要高性能的服务器来说,是不能接受的.所以,我们可以在进行读写操作的时候可以指定超时值,这样就读写操作就不至于一直阻塞下去. 在涉及套接字的I/O操作上设置超时的方法有三种: 1:调用alarm,它在指定的超时期满时产生SIGALRM信号.这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用. 2:在select中阻

python设定并获取默认的套接字超时时间

当需要处理socket库某些属性的默认值,例如套接字超时时间.你可以创建一个套接字对象实例,调用settimeout()法设定一个超时时间,在调用gettimeout()方法获取默认的超时时间,.这种操作在开发服务器应用时很有用. 技术点解析: 1.定义socket_timeout()函数,注意函数缩进格式. 2.socket库中的类函数创建一个套接字对象 使用socket.socket(socket.AF_INET,socket.SOCK_STREAM)首先创建了一个套接字对象socket()

将套接字设置为非阻塞状态

创建一个套接字并将之设置为非阻塞模式: SOCKET s; unsigned long ul = 1; int ret; s = socket(AF_INET, SOCK_STREAM, 0); ret = ioctlsocket(s, FIONRIO, (unsigned long)&ul); if(SOCKET_ERROR==ret) { //未能将套接字设置为非阻塞模式 }

UNIX网络编程卷1 回射客户程序 UDP 超时设置

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 最初代码: #include "unp.h" int main(int argc, char **argv) { int sockfd; struct sockaddr_in servaddr; if (argc != 2) err_quit("usage: udpcli <IPaddress>"); //1.指明服务器的 IP 地址和端口 bze