分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
Clamav杀毒软件源码分析笔记[十]
刺猬@http://blog.csdn.net/littlehedgehog
[客户端处理]
服务端已经把主要的工作都已经处理的差不多了,剩下来也就是服务端等待客户端提出请求,然后根据客户端的请求做相应的工作. 所以客户端所做的事情就只是提交数据,然后坐享其成.服务端是在垂帘听政呢,还是做幕后英雄?话不多说了,下面进入正题.
客户端(clamdscan)的主函数main和clamscan其实用的是同一个main,当然里面的内容同样还是处理命令行,配置文件等相关信息,乏善可陈,经过这系列处理之后,我们来到了client这个客户端的逻辑处理主函数.但是我还是不准备详细来说这个函数,因为它除了因为客户端只是创建socket和使用connect对服务端进行连接而不需要啥绑定,监听,实在和服务端的创建没多少代码上的区别. 只是在连接的时候,我们要分配置文件里是设定的本地连接还是网络连接. 如下所示:
- /* 创建套间字 并建立链接*/
- int dconnect(const struct optstruct *opt)
- {
- struct sockaddr_un server; //这里定义了两个地址,注意一个为AF_UNIX,而另一个为AF_INET
- struct sockaddr_in server2;
- struct hostent *he;
- struct cfgstruct *copt, *cpt;
- const char *clamav_conf = getargl(opt, "config-file"); //从config-file中获取配置文件名
- int sockd;
- if (!clamav_conf)
- clamav_conf = DEFAULT_CFG;
- if ((copt = parsecfg(clamav_conf, 1)) == NULL)
- {
- mprintf("@Can't parse the configuration file./n");
- return -1;
- }
- memset((char *) &server, 0, sizeof(server));
- memset((char *) &server2, 0, sizeof(server2));
- /* Set default address to connect to 这里默认是设置为本地地址*/
- server2.sin_addr.s_addr = inet_addr("127.0.0.1");
- if (cfgopt(copt, "TCPSocket") && cfgopt(copt, "LocalSocket")) //TCPSocket 和 LocalSocket 只能配置一个
- {
- mprintf("@Clamd is not configured properly./n");
- return -1;
- }
- else if ((cpt = cfgopt(copt, "LocalSocket"))) //本地socket,也就是用AF_UNIX地址域啦
- {
- server.sun_family = AF_UNIX;
- strncpy(server.sun_path, cpt->strarg, sizeof(server.sun_path));
- if ((sockd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
- {
- perror("socket()");
- mprintf("@Can't create the socket./n");
- return -1;
- }
- if (connect(sockd, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0)
- {
- close(sockd);
- perror("connect()");
- mprintf("@Can't connect to clamd./n"