如今能够改进客户程序,使它能够连接到不论什么有名字的主机,这次不是连接到演示样例server,而是连接到一个标准服务,这样就能够演示port号的提取操作了.
大多数UNIX和一些linux系统都有一项标准服务daytime,它提供系统的日期和时间.客户能够连接到这个服务来查看server的当前日期和时间.以下就是完毕这一工作的客户程序getdate.c
编敲代码getdate.c
大多数UNIX和一些linux系统都有一项标准服务daytime,它提供系统的日期和时间.客户能够连接到这个服务来查看server的当前日期和时间.以下就是完毕这一工作的客户程序getdate.c
编敲代码getdate.c
/*************************************************************************
> File Name: getdate.c
> Description: getdate.c
> Author: Liubingbing
> Created Time: 2015年07月24日 星期五 20时26分04秒
> Other: getdate.c
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
int main(int argc, char *argv[])
{
char *host;
int sockfd;
int len, result;
struct sockaddr_in address;
struct hostent *hostinfo;
struct servent *servinfo;
char buffer[128];
if (argc == 1)
host = "localhost";
else
host = argv[1];
/* 查找主机的地址,假设找不到,就报告一条错误 */
hostinfo = gethostbyname(host);
if (!hostinfo) {
fprintf(stderr, "no host: %s
", host);
exit(1);
}
/* 检查主机上是否有daytime服务 */
servinfo = getservbyname("daytime", "tcp");
if (!servinfo) {
fprintf(stderr, "no daytime service
");
exit(1);
}
printf("daytime port is %d
", ntohs(servinfo->s_port));
/* 创建一个套接字 */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
/* 构造connect调用要使用的地址 */
address.sin_family = AF_INET;
address.sin_port = servinfo->s_port;
address.sin_addr = *(struct in_addr *)*hostinfo->h_addr_list;
len = sizeof(address);
/* 然后建立连接并取得有关信息 */
result = connect(sockfd, (struct sockaddr *)&address, len);
if (result == -1) {
perror("oops: getdate");
exit(1);
}
result = read(sockfd, buffer, sizeof(buffer));
buffer[result] = '