⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 connect_nonb.c

📁 Unix网络编程 基于Socket的网络编程
💻 C
字号:
#include	"unp.h"intconnect_nonb(int sockfd, const SA *saptr, socklen_t salen, int nsec){	int				flags, n, error;	socklen_t		len;	fd_set			rset, wset;	struct timeval	tval;	flags = Fcntl(sockfd, F_GETFL, 0);	Fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);	error = 0;	if ( (n = connect(sockfd, (struct sockaddr *) saptr, salen)) < 0)		if (errno != EINPROGRESS)			return(-1);	/* Do whatever we want while the connect is taking place. */	if (n == 0)		goto done;	/* connect completed immediately */	FD_ZERO(&rset);	FD_SET(sockfd, &rset);	wset = rset;	tval.tv_sec = nsec;	tval.tv_usec = 0;	if ( (n = Select(sockfd+1, &rset, &wset, NULL,					 nsec ? &tval : NULL)) == 0) {		close(sockfd);		/* timeout */		errno = ETIMEDOUT;		return(-1);	}	if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset)) {		len = sizeof(error);		if (getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len) < 0)			return(-1);			/* Solaris pending error */	} else		err_quit("select error: sockfd not set");done:	Fcntl(sockfd, F_SETFL, flags);	/* restore file status flags */	if (error) {		close(sockfd);		/* just in case */		errno = error;		return(-1);	}	return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -