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

#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);
			continue;
		}
		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);
}

  

posted @ 2022-09-22 14:06  东宫得臣  阅读(96)  评论(0编辑  收藏  举报