char str[32];
/* 取得命令后第一个参数,即要解析的域名或主机名 */ ptr = argv[1];
/* 调用gethostbyname()。调用结果都存在hptr中 */ if( (hptr = gethostbyname(ptr) ) == NULL ) {
printf(\
return 0; /* 如果调用gethostbyname发生错误,返回1 */ }
/* 将主机的规范名打出来 */
printf(\ /* 主机可能有多个别名,将所有别名分别打出来 */ for(pptr = hptr->h_aliases; *pptr != NULL; pptr++) printf(\ alias:%s\\n\ /* 根据地址类型,将地址打出来 */ switch(hptr->h_addrtype) {
case AF_INET: case AF_INET6: pptr=hptr->h_addr_list;
/* 将刚才得到的所有地址都打出来。其中调用了inet_ntop()函数 */ for(;*pptr!=NULL;pptr++)
printf(\ address:%s\\n\ break; default:
printf(\ break; } return 0;
6
} (4)
客户端程序如下: #include
#define MAXDATASIZE 100 int
main(int argc, char *argv[]) { int fd, numbytes;
char buf[MAXDATASIZE]; char rvbuf[MAXDATASIZE]; struct hostent *he; struct sockaddr_in server; if (argc != 2) { printf(\ exit(-1);
}
if ((he =gethostbyname(argv[1])) == NULL) { perror(\ exit(1);
}
if ((fd =socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror(\
7
exit(1); }
bzero(&server,sizeof(server)); server.sin_family =AF_INET; server.sin_port=htons(PORT);
memcpy(&server.sin_addr,he->h_addr,sizeof(struct in_addr));
if (connect(fd, (struct sockaddr *)&server, sizeof(struct sockaddr)) == -1) { }
struct sockaddr_in localaddr; perror(\exit(1);
socklen_t len = sizeof(localaddr);
getsockname(fd,(struct sockaddr *)&localaddr,&len); printf(\
Localip
and
Localport
is: %s:%d\\n\
struct sockaddr_in peeraddr; socklen_t lenp = sizeof(peeraddr);
getpeername(fd, (struct sockaddr *)&peeraddr,&lenp); printf(\
Peerip
and
Peerport
is: %s:%d\\n\ }
服务器端程序如下: #include
8
close(fd);
#define PORT 1234 #define BACKLOG 1
void process_cli(int connectfd,struct sockaddr_in client); int main(void) {
int listenfd, connectfd; struct sockaddr_in server, client; int sin_size;
if((listenfd=socket(AF_INET, SOCK_STREAM, 0))==-1) { perror(\
exit(-1);
}
int opt=SO_REUSEADDR;
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); bzero(&server,sizeof(server)); server.sin_family =AF_INET; server.sin_port =htons(PORT);
server.sin_addr.s_addr =htonl(INADDR_ANY);
if (bind(listenfd, (struct sockaddr*)&server, sizeof(struct sockaddr))== -1) { perror(\ exit(-1);
}
if (listen(listenfd, BACKLOG) == -1) { perror(\ exit(-1);
}
9
sin_size =sizeof(struct sockaddr_in); while(1) {
if ((connectfd =accept(listenfd, (struct sockaddr *)&client,&sin_size)) == -1) { perror(\
exit(-1);
} close(connectfd);
}
close(listenfd); }
10