linux程序设计——套接字选项(第十五章)

58 篇文章 0 订阅
57 篇文章 9 订阅
现在可以改进客户程序,使它可以连接到任何有名字的主机,这次不是连接到示例服务器,而是连接到一个标准服务,这样就可以演示端口号的提取操作了.
大多数UNIX和一些linux系统都有一项标准服务daytime,它提供系统的日期和时间.客户可以连接到这个服务来查看服务器的当前日期和时间.下面就是完成这一工作的客户程序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\n", host);
		exit(1);
	}
	/* 检查主机上是否有daytime服务 */
	servinfo = getservbyname("daytime", "tcp");
	if (!servinfo) {
		fprintf(stderr, "no daytime service\n");
		exit(1);
	}
	printf("daytime port is %d\n", 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] = '\0';
	printf("read %d bytes: %s", result, buffer);

	close(sockfd);
	exit(0);
}
可以用getdate获取任一已知主机的日期和时间.

如果看到上面的信息,这可能是因为正在连接的计算机没有启用daytime服务.
程序解析
运行这个程序时,可以指定要连接的主机.daytime服务的端口号是通过网络数据库函数getservbyname来确定的,该函数以与返回主机信息类似的方法返回和网络服务相关的信息.程序getdate尝试连接到指定主机返回的地址列表中的第一个地址,如果成功,它就读取daytime服务返回的信息--一个表示UNIX日期和时间的服务.

15.3.2    套接字选项

可以用许多选项来控制套接字连接的行为,这些选项的数目众多,其中setsockopt函数用于控制这些选项,它的定义如下所示:
#include <sys/socket.h>
int setsockopt(int socket, int level, int option_name, const void *option_value, size_t option_len);
可以在协议层次的不同级别对选项进行设置.如果想要在套接字级别设置选项,就必须将level参数设置为SOL_SOCKET.
option_name参数指定要设置的选项,option_calue参数的额长度为option_len字节,它用于设置选项的新值,它被传递给底层协议的处理函数,并且不能被修改.
在头文件sys/socket.h中定义的套接字级别选项,如下所示:
选项                              说明
SO_DEBUG                打开调试信息
SO_KEEPALIVE         通过定义传输保持存活报文来维持连接
SO_LINGER                在close调用返回之前完成传输工作
setsockopt在成功时返回0,失败时返回-1.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值