zoukankan      html  css  js  c++  java
  • linux程序设计——套接字选项(第十五章)

    如今能够改进客户程序,使它能够连接到不论什么有名字的主机,这次不是连接到演示样例server,而是连接到一个标准服务,这样就能够演示port号的提取操作了.
    大多数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] = '';
    	printf("read %d bytes: %s", result, buffer);
    
    	close(sockfd);
    	exit(0);
    }
    能够用getdate获取任一已知主机的日期和时间.

    假设看到上面的信息,这可能是由于正在连接的计算机没有启用daytime服务.

    程序解析

    执行这个程序时,能够指定要连接的主机.daytime服务的port号是通过网络数据库函数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.

  • 相关阅读:
    新标准C++程序设计读书笔记_继承和多态
    新标准C++程序设计读书笔记_运算符重载
    新标准C++程序设计读书笔记_类和对象
    关于在linux中使用图形界面的网络管理工具
    桌面显卡天梯图和桌面cpu天梯图
    关于linux下关于ssd的使用
    archlinux中c语言的rpc编程
    关于eclipse的一些配置
    利用wireshark抓包获取cookie信息
    笔记本中的archlinux调节亮度
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6710350.html
Copyright © 2011-2022 走看看