需要一个对站别管控的程序。
所以,分析下来,这就需要:
1.一个服务器,带数据库。
2.三台机器,分别在三个没有网络的站别上。
3.一个程序可以上传资料,对资料进行判断。
在server机的一个目录下,需要用到两个监视脚本,以监视某些目录,管控从站别上传的文件。(或许可以改进,工作进行中)
事实上,在这个需求之前,我刚好写了上面的两个脚本,对client机上传的文件进行甄别,并根据结果对其做判断(是回复failed还是回复pass并记录站别到数据库)。在那时对mysql有一点点了解。由于需要远程处理。所以这次理所当然的选择mysql作为服务器的数据库。
一:server的搭建(ntp)(dhcp??)
在debian系的系统里,下载mysql比较简单。apt-get install mysql-server-5.0就行了(会附带安装mysql-client-5.0等)。
在mysql的配置上,花费了一些时间。
当我在mysql里使用
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
flush privileges;
后并没有如我期望的那样能够在别的机器上连接到服务器上。提示
ERROR 2003 (HY000): can not connect to MYSQL server on '72.16.1.209' (146)
查询了一些资料以后,发现:原来在server机上,还需要配置/etc/mysql/my.cnf
将bind-address=127.0.0.1改成bind-address=0.0.0.0;并/etc/init.d/mysql restart就可以了。
这样就可以使任何机器访问server机的数据库了,并且对所有database的所有table(*.*)都有所有的权限(all privileges)了,只需通过"123456"这个password。
注:这是特殊情况,实际应用中需要对不同client在不同的database中不同的table开通不同的权限。
数据库的搭建已经完成配置了,还需要建立以database。
mysql> create database the_base; /*创建shbase*/
mysql> use shbase;
mysql> create table the_table (mbsn char(20), station char(5), fault char(100), primary key (mbsn));
创建the_table,这里只建了三列,主板号,站别,错误项。为mbsn建立约束,杜绝数据库中出现多个统一mbsn的数据。关于数据类型见这里没有用到php。
这样,server端基本就配置好了。还有一个inotify脚本。放到后面说。
二:站别与server的通信
如上所说的。三个站别需要另摆一台机器做client。而另一个站别,将在此站运行的程序里完成对站别的判断。这就需要一个程序去做。
期间想在console界面下用脚本写,后来决定在图形界面下做。准备(gtk、libmysqlclient15-dev、mysql-client-5.0)。
在做这个之前我打算用pipe去调用脚本通信。但是mysql有专门的接口函数可以用,这就省事很多了。可以直接取数据了。
用到的函数有:
mysql_init();
mysql_real_connect();
mysql_real_query();
mysql_store_result();
mysql_fetch_row();
mysql_close();
这中间用到了g_strup_printf()合成字符串;需要g_free()释放内存。回调函数链接到动作。这里主要记一下遇到的问题和困惑,不时加上。以备忘。
1.entry
gtk_entry_set_max_length /*设置最大输入字符串长度,这里为18,18未宏定义*/
gtk_entry_get_text /*get_text*/
gtk_entry_set_text /*set_text,在每次动作完成后,清空entry*/
g_signal_connect(G_OBJECT(entry), "activate", G_CALLBACK(enter), (gpointer)entry); /*activate事件*/
2.notebook
gtk_notebook_append_page(顺序插入) /*notebook建立起来以后是空白的,这个函数顺序插入标签页*/
gtk_notebook_get_current_page(从0开始计数) /*根据page号,来switch不同站别,做不同的操作*/
3.mysql_real_query();mysql_store_result();mysql_fetch_row()
mysql_real_query返回的数据,用mysql_store_result()和mysql_fetch_row()得到。row是一个类似数组的结构。其中的列为row[0];row[1]……
mysql_real_query的有一些操作不会有result,包括:DELETE、INSERT、UPDATE。
mysql_real_query成功返回0。
4.return
在这期间,有些地方没有return,导致程序莫名崩溃。需注意。
5.功能测试
功能测试站是有网络的。而且仅在console下,并不在图形界面下。刚好可以用到上面提到的两个监视脚本。
准备vsftpd服务。
其
主要是用到一个inotifywait命令去监控ftp家目录下(more /etc/passwd | grep ftp | awk -F':'
'{print($6)}')的Request目录。测试程序会在测试过程中上传一个带mbsn的文件,inotifywait监测到create文件
后,在stdout输出文件名。重定向到一个txt文件中。另一个脚本会在检测到txt文件不为空时,读取出文件名。并去相应路径取到文件,解析内容。若
站别符合,就从数据库mysql中导出对应mbsn的信息;根据规则生成respond文件,放在ftp家目录下的Respond目录下。等待测试程序来
取。若不符合,则生成对应respond文件。
三:需要解决的问题
ntp不稳定(服务器开启一段时间,并且服务器端的配置文件中,将ntpd自身同步外部服务器的行注释掉),vsftp抢资源(根据产品唯一的mbsn号,对上传ftp的文件区分开,以保证不会写同一个文件)。