首页 > 代码库 > linux程序设计——套接字选项(第十五章)
linux程序设计——套接字选项(第十五章)
如今能够改进客户程序,使它能够连接到不论什么有名字的主机,这次不是连接到演示样例server,而是连接到一个标准服务,这样就能够演示port号的提取操作了.
大多数UNIX和一些linux系统都有一项标准服务daytime,它提供系统的日期和时间.客户能够连接到这个服务来查看server的当前日期和时间.以下就是完毕这一工作的客户程序getdate.c
编敲代码getdate.c
假设看到上面的信息,这可能是由于正在连接的计算机没有启用daytime服务.
option_name參数指定要设置的选项,option_calue參数的额长度为option_len字节,它用于设置选项的新值,它被传递给底层协议的处理函数,而且不能被改动.
在头文件sys/socket.h中定义的套接字级别选项,例如以下所看到的:
选项 说明
SO_DEBUG 打开调试信息
SO_KEEPALIVE 通过定义传输保持存活报文来维持连接
SO_LINGER 在close调用返回之前完毕传输工作
setsockopt在成功时返回0,失败时返回-1.
大多数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\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服务的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.
linux程序设计——套接字选项(第十五章)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。