首页 > 其他分享 >客户端通过gethostbyname获取服务端IP地址

客户端通过gethostbyname获取服务端IP地址

时间:2022-09-22 14:12:51浏览次数:53  
标签:addr pptr gethostbyname fprintf IP地址 exit include 服务端 struct

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

const int maxline=4096;

int main(int argc, char **argv) {
	int sockfd, n;
	char recvline[maxline+1], errbuff[maxline];;
	struct sockaddr_in servaddr;
	struct in_addr **pptr;
	struct in_addr *inetaddrp[2];
	struct in_addr inetaddr;
	struct hostent *hp;
	struct servent *sp;

	if(argc!=3) {
		fprintf(stderr, "usage: daytimetcpcli <hostname> <service>\n");
		exit(-1);
	}

	if((hp=gethostbyname(argv[1])) == NULL) {
		if(inet_aton(argv[1], &inetaddr)==0) {
			fprintf(stderr, "hostname error for %s: %s\n", argv[1], hstrerror(h_errno));
			exit(-1);
		} else {
			inetaddrp[0]=&inetaddr;
			inetaddrp[1]=NULL;
			pptr=inetaddrp;
		}
	} else {
		pptr=(struct in_addr **)hp->h_addr_list;
	}

	if((sp=getservbyname(argv[2], "tcp")) == NULL) {
		fprintf(stderr, "getservbyname error for %s\n", argv[2]);
		exit(-1);
	}

	for(; *pptr!=NULL; pptr++) {
		if((sockfd=socket(AF_INET, SOCK_STREAM, 0))<0) {
			strerror_r(errno, errbuff, maxline);
			fprintf(stderr, "socket error: %s\n", errbuff);
			exit(-1);
		}
		memset(&servaddr, 0, sizeof(servaddr));
		servaddr.sin_family=AF_INET;
		servaddr.sin_port=sp->s_port;
		memcpy(&servaddr.sin_addr, *pptr, sizeof(struct in_addr));
		printf("trying %s: %d\n", inet_ntop(AF_INET, &servaddr.sin_addr, errbuff, sizeof(errbuff)), ntohs(servaddr.sin_port));

		if(connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))==0) {
			break;
		} else {
			strerror_r(errno, errbuff, maxline);
			fprintf(stderr, "connect error: %s\n", errbuff);
			close(sockfd);
			exit(-1);
		}
	}
	if(*pptr==NULL) {
		fprintf(stderr, "unable to connect!\n");
		exit(-1);
	}

	while((n=read(sockfd, recvline, maxline))>0) {
		recvline[n]=0;
		if(fputs(recvline, stdout)==EOF) {
			fprintf(stderr, "fputs error\n");
			exit(-1);
		}
	}
	if(n<0) {
		fprintf(stderr, "read error.\n");
		exit(-1);
	}
	exit(0);
}

  

标签:addr,pptr,gethostbyname,fprintf,IP地址,exit,include,服务端,struct
From: https://www.cnblogs.com/donggongdechen/p/16719044.html

相关文章

  • 利用curl命令查看Mac和Linux的ip地址
    curl是http命令行工具。它支持文件的上传和下载。curl命令可以拉取一个网页,语法也很简单:1curlhttp://www.linux.com然后会返回:1<html>2<head><title>301Moved......
  • 删除远程桌面链接下拉框ip地址
    一、介绍如下图,远程桌面连接会将我们以前连接过的主机IP地址都记录在这个下拉框里,为了某些原因我们可能需要删除这些记录!【请先阅读“三、备注”后操作】二、操作步骤......
  • django 前后端交互-ip地址
    1、前端统一配置后端地址  2、前端启动带IP  3、后端启动带IP和端口pythonmanage.pyrunserver100.110.34.202:8000同时,修改如下配置 ......
  • tomcat启动成功,网页无法使用设定ip地址打开
    1.启动tomcat程序,查看日志catalina.log文件,显示启动成功;2.使用localhost:7788或者127.0.0.1:7788,均可打开对应网页,但不满足要求,不能与后端程序进行通信;3.将以太网的ip......
  • 安装 UrBackup服务端
    安装UrBackup服务器配置固定IP:https://www.cnblogs.com/congcongdi/p/10149925.html1.1安装urbackupserver系统。cd/etc/yum.repos.d/wgethttps://download.ope......
  • ESXi重置密码以及修改网络IP地址的方法
    StudyFromhttps://www.cnblogs.com/mk21/p/15784082.html前期公司有部分虚拟化的服务器因为只通过vCenter进行管理.导致密码遗失. 最近因为公司的服务器要切换IP......
  • IP地址基础知识
    一、IP地址相关概念在TCP/IP网络通信时,为了保证能正常通信,每个设备都需要配置正确的IP地址,否则无法实现正常的通信。IP地址(IPv4地址)由32位正整数来表示,IP地址在......
  • 你可得知道物理地址与IP地址
    来看看计算机网络中这些常见的概念你有没有理解~物理地址表示方式物理地址即mac地址,每个网卡都有6字节的唯一标识,前三个字节表示厂商,后三个字节由厂商随机分配。如何......
  • 在consumer producer运行时停止kafka服务端会怎样
    结论服务端停止时,客户端程序会报错;服务端启动后,客户端程序能继续运行。也就是,消费者线程并未异常退出。实验步骤(1)停止后,consumer和producer会报错。消费者:.___......
  • Ubuntu SSH服务端配置
    UbuntuSSH服务端配置SSH分客户端openssh-client和openssh-server如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有则sudoapt-geti......