• 客户端通过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);
    }
    

      

  • 相关阅读:
    前端通过ajax请求,调用net core webapi接口
    WeUI——手机验证码
    Docker学习笔记之--安装mssql(Sql Server)并使用Navicat连接测试(环境:centos7)
    Docker学习笔记之-推送镜像到Registrys仓库
    PuppeteerSharp 在asp.net中使用 PuppeteerSharp生命周期管理
    vscode 插件记录下
    angular 项目8升级9 踩坑
    Skoruba.IdentityServer4.Admin 踩坑
    VUE-MATOMO实现埋点
    netcore rpm
  • 原文地址:https://www.cnblogs.com/donggongdechen/p/16719044.html
Copyright © 2020-2023  润新知