去掉输入参数的tcping

TCPing工具通过非阻塞连接检查特定端口是否可达,用于网络连通性的快速检测。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* tcping does a nonblocking connect to test if a port is reachable.

 * Its exit codes are:
 *     -1 an error occured
 *     0  port is open
 *     1  port is closed
 *     2  user timeout

 */

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/time.h>
#include <fcntl.h>
#include <arpa/inet.h>

#define SRV_IP "8.8.8.8"
#define SRV_PORT 53

int main (int argc, char *argv[]) {

	int sockfd;
	struct sockaddr_in addr;
	int error = 0;
	int errlen;
	int ret;
	struct timeval timeout;
	fd_set fdrset, fdwset;

	timeout.tv_sec=10;
	timeout.tv_usec=0;
	if((sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0){
		printf("socket error.\n");
		return -1;
	}

	memset(&addr, 0, sizeof(addr));
	addr.sin_family = AF_INET; 
	addr.sin_port = htons(SRV_PORT);
	if(inet_pton(AF_INET,SRV_IP,&addr.sin_addr) < 0){
		printf("inet_pton error.\n");
		close(sockfd);
		return -1;
	}

	fcntl(sockfd, F_SETFL, O_NONBLOCK);
	if (connect(sockfd, (struct sockaddr *) &addr, sizeof(addr)) != 0) {
		if (errno != EINPROGRESS) {
                	printf("%s\n", strerror(errno));
                        return (-1);
                }

		FD_ZERO(&fdrset);
		FD_SET(sockfd, &fdrset);
		fdwset=fdrset;
		if ((ret = select(sockfd+1, &fdrset, &fdwset, NULL, &timeout)) == 0) {
			close(sockfd);
			printf( "timeout.\n");
			return(2);
		}

		if (FD_ISSET(sockfd, &fdrset) || FD_ISSET(sockfd, &fdwset)) {
			errlen = sizeof(error);
                        if ((ret=getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &errlen)) != 0) {
                                printf( "getsockopt error.\n");
                                close(sockfd);
                                return(-1);
                        }

                        if (error != 0) {
                        	printf( "closed.\n");
                                close(sockfd);
                                return(1);
                        }
                } else {
                        printf("select: sockfd not set\n");
			close(sockfd);
                        return(-1);
                }
        }

	printf("connection established.\n ");
	close(sockfd);
	return 0;
}

	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值