依睛(IT blog) 我回来了,PHP<-->C/C++ LINUX

笨鸟

统计

积分与排名

友情连接

最新评论

re: C/C++ 连接mysql 乱码处理 向左向右走 2009-02-13 20:07
if (mysql = mysql_real_connect( myData, NULL,"root", "123456", szTargetDSN, MYSQL_PORT, NULL, 0 ) )//
printf("connect success!\n");
else
printf( "Error connecting to database: \n");
mysql_query(myData,"set names 'gbk'");

这个也可以mysql_query(myData,"set names 'gbk'");

在VC 下可用的, 不知道的我. 哎...
re: C/C++ 连接mysql 乱码处理 向左向右走 2009-02-13 20:06
mysql_query(myData,"set names 'gbk'");
re: base64源程序 向左向右走 2009-02-03 14:00
 6.8 Base64 Content-Transfer-Encoding
  设计Base64内容传输编码是为了描述任意的不需要人为识别的字节序列。编码及解码算法很简单,不过,编码后的数据总是比编码前的数据长33%。Base64与RFC1421中定义的Privacy Enhanced Mail (PEM)是同一个编码方法。
  由US-ASCII中65个字符组成一个子集,使用6位来表示每一个可打印的字符(第65个字符“=”表示要进行特殊的操作)
  注意:这个子集有个很重要的性质,那就是,在任何版本的ISO 646(包括US-ASCII)中,它都被描述成相同的内容。而且,在任何版本的EBCDIC中,子集中的所有字符也都具有相同的描述。其它常用的的编码,如UUENCODE、Macintosh binhex 4.0 [RFC-1741]、base85就没有这些性质,因此就无法满足邮件二进制传输编码的可移植性要求。
  编码时,每次输入24位数据,输出为4个编码字符。将输入的3个8位字节从左到右连续排列,就可以形成24位数据。将这24位看做是4个连续的6位组,每组都可以单独译成一个base64表中的字符。当通过base64编码方式编码一个位流时,必须假定位流为“重要位优先”的顺序。就是说,位流中的第1位应该是第一个字节中的最高位;位流中的第8位应该是第一个字节中的最低位,依此累推。
  用每组(6位)的值来索引64个可打印字符。索引后将得到的字符依次放入输出字符串中。选择表1中的这些字符,是为了能够完备的描述,并且排除在SMTP中有特殊意义的字符(如‘.’、CF、LF)以及在RFC2046中定义的multipart的边界分隔符中有特殊意义的字符(如‘-’)。
  表1:base64字母表
   Value Encoding Value Encoding Value Encoding Value Encoding
   0 A 17 R 34 i 51 z
   1 B 18 S 35 j 52 0
   2 C 19 T 36 k 53 1
   3 D 20 U 37 l 54 2
   4 E 21 V 38 m 55 3
   5 F 22 W 39 n 56 4
   6 G 23 X 40 o 57 5
   7 H 24 Y 41 p 58 6
   8 I 25 Z 42 q 59 7
   9 J 26 a 43 r 60 8
   10 K 27 b 44 s 61 9
   11 L 28 c 45 t 62 +
   12 M 29 d 46 u 63 /
   13 N 30 e 47 v
   14 O 31 f 48 w (pad) =
   15 P 32 g 49 x
   16 Q 33 h 50 y
  编码输出的流必须被描述成一些不大于76字节的行。解码时,必须要忽略换行符及其它所有不存在于表1中的字符。在base64数据中,除表1中字符、换行符、空格之外的字符都可能表示存在传输错误,在某些情况下,可以适当的给出一些警告信息甚至是拒绝信息。
  如果需要被编码数据的剩余部分不足24位,则要执行特殊的操作。编码量通常在主体(body)结尾部分结束。当输入少于24位时,会在末尾(右侧)添加一些值为0的位,以形成完整的6位组。用“=”来表示数据结尾的填充。因为所有base64的输入都是完整的字节,所以只可能出现如下情况:(1)最后的编码输入是完整的24位;这时,编码输出的最后一个单元会是完整的4个不为“=”的个字符。(2)最后的输入是8位;这时,编码输出的最后一个单元是两个编码字符后接两个填充字符“=”。(3)最后的输入刚好是16位;这时,编码输出的最后一个单元是三个编码字符后接一个填充字符“=”。
  因为“=”是用来填充数据的结尾部分,所以,它的出现意味着可能已经到达数据末尾(但不切断传输)。然而,也可能无法以这种方式进行判断:当传输的字节个数是三的整数倍时,编码中就不会出现“=”。
  在base64编码数据中,要忽略任何不属于base64字母表的字符。
  一定要注意,当base64编码直接应用于未经过规范化的文本内容时,要使用恰当的字节做为换行符。特别是在进行base64编码前,必须要将文本换行符转换为CRLF序列。要注意,一件很重要的事情就是:这些操作可以直接由编码器来完成,而不是在一些实现中先进行一个标准化的步骤。
  注释:不用担心multipart实体中的base64编码部分引用到潜在的边界分隔符(boundary delimiter),因为base64编码中没有使用连字符“-”。
  7. Content-ID 头字段
  在构建一个高级别的用户代理时,可能会需要在一个主体(body)中涉及到另一个主体。因此需要用“Content-ID”头字段给主体(body)设置标签。这个字段在语法构成上与“Message-ID”相同:
  id := "Content-ID" ":" msg-id
   与Message-ID的值一样,Content-ID的值也必须是世界上唯一的。
   Content-ID的值可以被用来在多处上下文中唯一的确定MIME实体,尤其用于被message/external-body机制所引用的缓存数据。虽然Content-ID头字段通常是可选的,但是对于生成可选的媒体类型“message/external-body”的实现程序来说,它则是必须存在的。这就是说,每一个message/external-body实体(entity)必须有一个Content-ID字段来允许对这些数据的缓存。值得注意的是,Content-ID值在multipart/alternative媒体类型中有特殊的意义。这一点会在RFC2046中关于multipart/alternative的那一节中进行解释。
我进入了mysql命令行,输入show mysql,但是没有任何反应

问题补充: Enter password: **Welcome to the MySQL monitor. Commands end with ; or g.Your MySQL connection id is 10Server version: 5.0.51a-community-nt MySQL Community Edition (GPL)Type 'help;' or 'h' for help. Type 'c' to clear the buffer.mysql&gt; show mysql -&gt;mysql是安装mysql之后的一个默认系统数据库 但是我这样却没有反应为什么?




命令是以;结束的,你忘记了,记住,是英文状态下的;
post 提交表单: 名称等于值
Input something: <input type="text" name="inputbox1" value="Hello world" size="25"><BR>

name=value+value&name=value+value

inputbox1=Hello+world&textarea1=33333333333333333&choices=1&checkbox1=1&selone=1&selmore=1&testit=submit+test+test+case&submit_flags=yes

捕捉异常
#if EXCEPTION_DEBUG
int v=0, *p1=&v, *p2=NULL;
*p2 = 0;
#endif
//另一种,用memset
struct A {
int i;
float f;
}

int main() {
A aa[100];
memset(aa, 0, sizeof(A) * 100); //bzero()
}

====================================

初始化成 0

typedef struct
{
....
}XXX;

XXX xxx[N];

memset(&xxx, 0, sizeof(xxx));
#include <stdio.h>
#include <string.h>

int main(int argc,char* argv[])
{
int i=0;

if (argc<=1)
return 0;

argc--, argv++;
while(i<argc)
{
printf("%s\n", *argv);
i++;
argv++;
}

return 0;
}

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
HANDLE semhandle;
//
//DWORD WINAPI callThread(LPVOID *arg)
//{
// // Sleep(4000);
// ReleaseSemaphore(semhandle,1,NULL);
// printf("hello wordl\n");
// return 0;
//}
//
//
//DWORD WINAPI callThread1(LPVOID *arg)
//{
// WaitForSingleObject(semhandle, -1);
// printf("hello wordl2\n");
// return 0;
//}
//
//
//int main()
//{
// HANDLE handle, handle1;
// unsigned long dw;
// semhandle = CreateSemaphore(NULL, 1, -1, NULL);
//
// handle = CreateThread(NULL,0, callThread, NULL, 0, &dw);
//
// handle1 = CreateThread(NULL,0, callThread1, NULL, 0, &dw);
//
//
// WaitForSingleObject(handle,-1);
// WaitForSingleObject(handle1, -1);
// CloseHandle(semhandle);
// }


int main()
{
time_t start;
int i;

for(i=0; i<5; i++)
{
start=time(NULL);
Sleep(2000);
printf("minus: %lds\n", time(NULL)-start);
}
}
#define MyStru(StruName) struct My##StruName \
{ \
char szName[32]; \
};

MyStru(Dog);
void main()
{

struct MyDog dog;
strcpy(dog.szName,"White");

printf(dog.szName);
printf("\n");
}
#include <stdio.h>
#include <string.h>
#include <ebstring.h>

int main(void)
{
char * str = "Hello world xxx\r\n fff fff f ";
char * pstart;
int len = 0;

STRING_FOREACH_WORD(str, pstart, len, "\x20\r\n\t")
{
printf("str: >>%.*s<<\n", len ,pstart);
}
}
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <time.h>

typedef struct entry
{
char name[40];
int ind;
union{
int rank;
double dou;
}infor;
}entry;

int main()
{
entry *entryy;
entryy =(entry*)malloc(sizeof(entry));
entryy->infor.dou = 3.44;
entryy->infor.rank = 44;

printf("%d %f\n", entryy->infor.rank, entryy->infor.dou);



return 0;
}
re: socket 多线程代码 向左向右走 2008-11-24 22:15
代码可以运行. 因没时间 没写太详细
re: Linux 常用命令 向左向右走 2008-09-17 16:32
 
这辈子都记住这个cd啦, 当时训的哭的要命, 去年的事拉,
过去啦, 但都不会忘记当时哭的样子, 哭着学习.........

cd
  cd命令不仅显示当前状态,还改变当前状态,它的用发跟dos下的cd命令基本一致。
  cd ..可进入上一层目录
  cd -可进入上一个进入的目录
  cd ~可进入用户的home目录
  

re: Bat文件编写 向左向右走 2007-10-25 20:19
转载)一、查漏补缺——给系统功能添把火

  我们的操作系统虽然功能强大,但是在某方面的应用上依旧存在欠缺,如:没有定时关机软件。而用bat文件可以解决很多这类问题。

  1.关机与重启

  我们先做个让电脑在每天指定时间关机的bat,具体方法如下:
打开附件中的记事本,然后在里边写入,at 22:00 shutdown -s -f,然后选择“文件→保存”,保存类型选择“所有文件”,然后将其命名为:shutdown.bat,如图1所示。如果你希望每天都在晚上十点关机,则将这个文件拖动到“开始→程序→启动”中,这样每次开机该文件都将被执行,其具体含义是,at 22:00在每天十点,shutdown -s -f关机且关闭所有未响应程序。

  如果你需要经常重启机器,可以编写一个快速关机的bat文件,还是打开一个记事本,写入:

@echo off
//关闭命令行显示
%systemroot%\system32\shutdown -r -t 0
//-r参数表示重启计算机,-t表示时间后边跟随等待秒数,为0则表示马上重启

  2.磁盘整理

  Windows XP自带的磁盘碎片整理程序无法进行全盘整理,我们可以编写一个全盘整理的bat,在记事本里边输入:

defrag c: /f /v
defrag d: /f /v
//有几个分区就写几行,其中-f表示即使可用磁盘空间不足,也强制进行磁盘整理。-v表示显示整理结果。

  将这个存为bat文件,再双击即可。如果你嫌整理的时间太长,不愿意在一旁守着,可以在文件的结尾输入:shutdown -s -f,让其执行完关机即可。

二、一律从简——让网络操作变轻松

  访问共享文件夹、备份网络数据、切换网络配置等常规网络操作,如果采用传统做法,实在是费时费力。用bat文件,一切将可以简化为一个双击动作。

  1.备份还原网络配置

  对于经常使用笔记本电脑在两地上网的朋友,切换网络配置就成了家常便饭,总是该来该去实在麻烦,用bat文件可以使一切都变得简单。

  首先选择“开始→运行”,输入:cmd,回车后进入命令行界面,然后输入:netsh -c interface dump>d:\home.txt,回车后,系统将会把你当前的网络配置备份到d盘的home.txt文档中。然后开始编写bat文件,只有简单的一行:netsh -f d:\home.txt,保存为bat文件,以后双击该文件就会应用home.txt中的网络配置。如果你觉得两个文件烦,也可以将两个文件写成一个bat文件:



@echo off
netsh interface ip set address name="本地连接" source=static addr=10.10.10.1 mask=255.255.255.0
//设置本地连接的ip地址为:10.10.10.1,子网掩码为:255.255.255.0
netsh interface ip set address name="本地连接" gateway=110.10.10.2 gwmetric=0
//设置网关
netsh interface ip set dns name="本地连接" source=static addr=10.10.10.3 register=PRIMARY
//设置主dns
netsh interface ip add dns name="本地连接" addr=10.10.10.4
//设置备份dns
netsh interface ip set wins name="本地连接" source=static addr=none
//设置wins

  2.在局域网中群发信息

  如果你局域网中的机器没有禁止信使服务的话(启用方法为:在“运行”里输入:services.msc,双击里边的Messenger,选择启用即可),当需要定时向全网发送消息时,完全可以用批处理文件实现,实现方法是:

rem 准备发布“9点断网”给局域网所有计算机
//显示在bat运行前,起到提示作用
pause
//暂停运行,按任意键继续,如果需要定时运行,则不要此段
net send * 9点断网
//发送下“9点断网”的信息,网段中所有的机器,“*”表示所有的机器

  将其保存为bat文件,双击后得到如图2所示的效果。再按键盘上的任意键,信息将被发送到全网。如果你希望它定时发送,则将pause字段去掉,然后将其加入到计划任务中即可。


  3.打开或关闭网络共享


  当你需要共享某个远程的文件夹时,总要跑到本地去操作,如果数量众多,就有可能跑断腿,我们可以编写一个自动共享硬盘的bat文件,将文件发给用户,只要其双击该文件,即可实现共享的目的。

@echo off
echo REGEDIT4>c:\1.reg
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Network\LanMan\E]>>c:\j.reg echo "Flags"=dword:00000102>>c:\j.reg
//Flags用于是确定共享目录的访问方式,其中"Flags"=dword:00000102是完全共享,101是只读,103是根据密码访问。
echo "Parm1enc"=123:>>c:\1.reg
//Parm1enc键值保存着完全访问方式下的密码
echo "Parm2enc"=456:>>c:\1.reg
//Parm2enc键值保存着只读访问方式下的密码
echo "Path"="D:\">>c:\1.reg
//Path键值是共享文件夹的路径
echo "Remark"="我共享了你的D盘">>c:\1.reg
//Remark键值是备注
echo "Type"=dword:00000000>>c:\1.reg
REGEDIT /S c:\j.reg DEL c:\j.reg cls exit

  用户运行这个bat文件后,再注销一下,文件夹就会被共享出来了。如果你每天都需要访问某个共享文件夹,且这个共享文件夹设置了密码,你还可以让bat文件帮你在开机的时候先输入密码,你再访问时就只需要双击打开即可。输入:net use \\192.168.0.1\IPC$ "1234" /user:"administrator,这个表示访问PC机192.168.0.1上边的共享文件夹,用administrator用户,密码为:1234。将其保存为bat文件,并将其加入到启动组中即可。

共享文件夹管理不当,会产生严重安全隐患,所以有时为了安全,需要批量卸载掉共享文件夹,其实只要将命令:net share c$ /del加入到bat文件中即可,其中c$为共享文件夹的名字,完整的例子可以到XXXX下载。

  4.备份网络数据

  你还可以利用bat文件将数据备份到局域网内的某台文件服务器上,这样就省去了复制粘贴的麻烦,具体做法是:


set source=e:\work
//文件来源为本机e盘的work文件夹
set dest=\\192.168.0.1\backup
//目标文件夹为PC机192.168.0.1的backup文件夹
net use \\192.168.0.1\IPC$ "1234" /user:"administrator"
xcopy %source% %dest% /e /v /r /y /z
//将源盘文件拷贝到目的服务器

  将其保存为bat文件,以后只要双击此文件即可完成备份任务。

三、固若金汤——令电脑安全更放心

  1.用bat加密文件

  无论使用使用加密工具还是系统自带的EFS加密,一旦遇到密码丢失或者证书损坏时,想要恢复原来的文件就变得非常困难,用bat文件实现的加密则非常简单。

  具体的操作步骤为,首先在D盘中建立一个文件夹ABC,然后在运行中输入:cmd后回车,打开命令行编辑窗口,然后输入:

C:\>Documents and Settings\Administrator\cdC:\>d:
D:\>cd abc
D:\abc>md 1..//在abc目录下建立s.目录



  然后在abc目录下建立一个bat文件,内容为:

copy abc\* 1..\*
del /q abc\*

  将其保存为:加密.bat,并将其放到abc目录下。然后再建立一个bat文件,内容为:

copy 1..\* abc\*

  将其保存为:解密.bat,顾名思义,需要加密文件时双击加密.bat文件,需要解密时双击解密.bat文件。

  我们来了解一下这个加密的具体原理,在Windows中“\”符号代表的是路径分隔符,用于区分父文件夹与子文件夹。所以Windows无法打开名称中含有“\”的文件或文件夹,双击这类文件或文件夹时系统会提示错误,如图3所示。而这类文件夹在命令行模式下是可以访问的。我们在abc文件夹中建立这么一个无法打开的文件夹,当需要加密时,用加密.bat将abc文件夹中的内容复制到这个特殊文件夹中。反之,将其复制出来则完成解密工作。如果将命令:D:\abc>md 1..\,改为:D:\abc>md 1..\a,则1..\文件夹将不可见。


  2.屏蔽淘宝网广告

  很多惹人厌的网站都喜欢在我们的机器中弹出一堆的广告,以增加其知名度,淘宝就是其中的一个,它的广告在你的桌面上肆无忌惮的弹出,实在让人没有安全感,我们可以用bat文件将其禁用。对于操作系统是Windows XP/2003的系统,建立bat文件:


%SystemRoot%\system32\notepad.exe C:\WINDOWS\system32\drivers\etc\hosts
#kill taobao
0.0.0.0 www.taobao.com
0.0.0.0 search.taobao.com
0.0.0.0 taobao.com
0.0.0.0 www.unionsky.cn
0.0.0.0 www.allyes.com

  如果操作系统是Windows 98/ME,则需将首行替换为:%SystemRoot%\system32\notepad.exe C:\WINDOWS\hosts,这个bat文件的作用是将与淘宝相关的网页都指向一个空IP,是你的机器无法访问淘宝,也就不会看到它的广告了,呵呵。

  其实bat文件还有很多强大的功能,如:自动安装软件、操作系统,杀毒,批量删除文件等。由于篇幅所限这里就不一一介绍了。最后提一句,bat文件还可以用于优化系统中的各项服务,优化文件可以在其他站下载:

http://www.rhutech.net/artdown/datf.rar


  既然大家都这么支持~!~!那么我就再来点锦上添花,是不是有的朋友不大喜欢用共享,而习惯FTP呢 ? 那么如果用FTP大家又该怎么样来操作呢,请看
  
  我们创建一个本地****.bat,这么写:
  
  echo open 192.168.1.222 >ftp.txt
  echo user >>ftp.txt
  echo pswd >>ftp.txt
  echo get run.bat c:/run.bat >>ftp.txt
  echo bye >>ftp.txt
  ftp -s:ftp.txt
  del ftp.txtstart c:\run.bat
  
  解释:
  
  echo open 192.168.1.222 >ftp.txt 隐藏命令,打开FTP服务器192.168.1.222,标记文件ftp.txtecho user >>ftp.txt 隐藏命令,登陆ftp服务器的用户名标记文件ftp.txtecho pswd >>ftp.txt 隐藏命令,登陆ftp服务器的密码标记文件ftp.txtecho get run.bat c:/run.bat >>ftp.txt 隐藏命令,下载ftp服务器上的run.bat文件到本地c:\run.bat标记文件ftp.txtecho bye >>ftp.txt 隐藏命令,退出ftp服务器标记文件ftp.txtftp -s:ftp.txt 。。。标记文件ftp.txtdel ftp.txt 删除ftp.txt文件
  start c:\run.bat 运行c:\run.bat文件
  
  
  
  前三行是把你的ftp连接信息写入一个ftp.txt文件中,
  
  第四行也是把从这个ftp下载run.bat文件这条命令写入ftp.txt.
  
  第五行,是把退出ftp写入ftp.txt文件,
  
  第六行,是根据ftp.txt文件来连接ftp.从而从这个ftp中下载到run.bat文件到C:盘。
  
  第七行,删除这个ftp.txt文件,
  
  第八行,运行run.bat文件。
  
  EXE文件同理 另外建议大家使用FTP时,尽量把文件压缩成自动解压缩文件,传输速度快.

re: 安全脚本程序的编写 V1.0(1) 向左向右走 2007-10-14 18:14
哈哈...学会了查问题!

找到乐趣, 找到了如何学习
思路决定出路,态度决定高度!
如今,随着分布式的网络计算设备的广泛应用,网络设备开发商也面临着众多的挑战,他们要去面对在私有和公共网络中如何有效实现与别的厂商之间设备的互连互通问题。并且,网络技术发展如此迅速,以至于今天的先进网络设备可能在一年或者半年后就过时了。作为开发者来说,他们必须得考虑这种快速的发展趋势,从眼前和长远的角度出发,基于互操作性、可扩展性以及高性能等要求来规划其产品开发计划。

网络设备供应商在产品开发中要选择一系列的系统组件,比如说网络芯片、CPU、嵌入式OS以及机架。与此同时,他们要对自己的系统软件体系结构充满信心,相信它能够迅速地集成到新的产品设计中,并在类似的新设备中重用任何以前开发的应用。其间,最核心的问题就是如何实现所有网络平台之间的互操作性,而不管所使用的是何种硬件和操作系统。

另外,系统设计者还将面临以下的一些问题。比如说,今天的网络设备必须支持多种标准,这也包括了任何已经出现并逐步成熟的将来的标准。当新技术可用时,网络系统必须能够将它集成进来,从而使得供应商可以加入自己的增值功能来满足一些独特的客户需求。

那么,设备制造商到底要如何来研制产品系统以便和任何其他类似的系统互连互通呢?一种得到验证的方法就是使用抽象的网络软件框架,从而使系统无论是对于当今和将来的标准,还是对于任何硬件设备和操作系统平台,都可扩展并适用于其上。这样的方法使得系统设计人员不仅可以重用内部软件开发的成果,而且也可以迅速地将其他资源组件集成到产品中来,不管它们是开放源代码的或者是第三方商业软件。

硬件及操作系统独立

当今的网络软件需要独立于任何特定的硬件基础设施。假设你为某个固定配置产品编写了一套特定的软件,该产品是基于ASIC芯片设计的,有24个端口,并且没有任何系统冗余。那么,对于一个摆放在AdvancedTCA机架上的,基于网络处理器芯片且具有完全的硬件冗余的设备来说,你将不能将你的软件轻松地移植到其上去。你将需要要投入大量的时间来重写该软件的主要部分。

另外,为了优化产品线中不同层次产品的性价比,很多公司在一系列产品中使用了多个嵌入式操作系统平台。对于价格敏感的低端产品,网络供应商往往会采用不需要版税的Linux来作为操作系统平台,而对于需要复杂功能的高端产品线则可能会使用商业的RTOS比如说VxWorks,或者是同时使用VxWorks和Linux。为了避免针对每个产品都要重写一套软件接口,你需要一个独立于操作系统和硬件的软件平台。

嵌入式Linux逐渐成为了系统设计人员的一种流行的选择,其中的原因也已经不再是它的免收版税的商业模式,更多的是因为它对各种CPU和目标板的支持,以及有了越来越多的熟悉Linux操作环境的工程师。同时,Linux社区和商业Linux提供商也对内核进行了实时扩展,这些扩展特性带给了用户很多商业RTOS所能提供的相同级别的鲁棒性(robustness)。另外,开放源码社区和商业公司所提供的开发工具,也使得Linux成为了一个物美价廉的开发环境,网络设备商可以利用它们来完成跨平台的产品开发。

"硬件及操作系统独立"解决方案就是要将系统软件编写成可重用的构件,它使用了一系列的抽象接口,来完成对特定硬件平台的检测并无缝集成到任何的操作系统中。当你在不同硬件平台上开发产品时,具备抽象层的软件体系结构能够很好地保护你在软件应用开发上的投资。这种抽象层在应用软件和其他程序之间建立了一个公共接口,由于该接口主要与控制平面单元交互,它们对于总体的系统性能的影响会很小甚至可以忽略。

举例来说,软件可以设计成允许所有协议应用都假定自己与某个单独的网络接口交互,其中必须得有一个抽象层来翻译递交的数据库修改请求并将它定向到某个或某几个合适的转发单元(如网络处理器或者ASIC/ASSPs),而该转发硬件甚至可以是一个位于其他设备上的某个网络芯片。

通过将控制派发功能进行抽象,应用协议编程人员不需要了解系统的特殊细节,就可以开发出复杂的软件。

人们可以通过使用如LVL7公司的FASTPATH设备转换层(DTL),在应用软件和网络硬件之间编写一个接口,来实现系统的"网络硬件独立"。当我们使用多个网络芯片时,DTL将决定如何与特定网络硬件设备的物理端口来接口。一些核心的服务如增加路由、删除路由、端口使能、端口禁止、获取端口状态等等将通过标准的API来映射到底层实现。虽然DTL层解决了特定网络接口硬件到应用协议层之间的抽象问题,但它并没有解决平台硬件的抽象问题(这一问题由系统抽象层来处理)。

系统抽象层

"系统抽象层"(在LVL7公司的FASTPATH软件中叫做SYSAPI)使得你可以实现一种对于RTOS、CPU和所运行产品物理特性完全透明的软件,该层包括了板级支持包(BSP)或者Linux支持包(LSP)。使用这种公共通用接口,高层软件在并不了解底层硬件特性的情况下也可以访问底层服务,比如对非易失性内存的读写。

公共操作系统服务,如任务管理、内存管理和信号灯等,也可以通过RTOS抽象层来映射(在LVL7公司的FASTPATH软件中叫做OSAPI),从而应用程序就可以基于OSAPI来编写而不需要直接调用特定的操作系统服务。通过提供这样的一个抽象层,人们可以使用众多的商业和开放源代码操作系统或是一个内部的操作系统来开发产品。在这里,重要的一点就是,应用软件必须使用抽象调用接口而不是底层操作系统本身的API调用。

底层操作系统IP网络协议栈所提供的服务也可以被当作操作系统服务映射出来,比如说,网络插口调用(socket calls)可以通过OSAPI层来映射。作为另外的一种选择,我们也可以把IP协议栈当作一个单独的实体,与操作系统抽象接口区别开来。

API独立

跨平台互操作性的另外一个关键点是"管理系统抽象层"(在LVL7公司的FASTPATH软件中叫做单元栈管理器数据库即USMDB),它使得用户接口不需了解诸多物理细节,如物理端口在什么位置或者是何种类型等,只需简单地将其视为一个逻辑接口,该抽象层负责将用户请求发送到合适的子系统而不需要用户接口的参与。

管理系统抽象层在软件应用和管理实体之间提供了一个单一的接口,这就允许多个用户接口来控制同一个底层应用服务集,至于底层是网络处理器还是ASIC则并不重要。每个需要管理的数据对象都通过管理系统层接口来映射,从而形成一套统一的访问例程。该抽象层不但适用于协议和应用数据(如OSPF接口信息和L2桥项等),也适用于任何特定硬件系统数据(如物理端口计数器和串行端口速度等)。

所有的用户接口通过一套公共的API来与下层应用交互,这样就可以编写一个单一的接口集来实现设置和获取配置参数或其他数据等功能。SNMP、CLI、Web、TLL和XML都可以访问这个单一的管理接口来获得或设置数据。这与传统的实现方法相比具有巨大的优势,为了获得管理信息,传统方法要针对每个管理接口实现一套自己的访问例程来进入应用代码或者硬件驱动。这种传统的方法也给代码维护升级带来了很大的问题,人们必须付出大量的工作来增加或者扩展一个新功能,因为每个管理接口都要重复几乎同样的工作。

支持多个网络协议标准

然而,硬件和操作系统独立并不能完全满足要求。已有的宽带通信标准纷繁复杂,而新的标准又不断涌现,因此嵌入式网络平台对多个协议标准的支持势在必行。系统软件必须能够支持和兼容已经部署的网络设备上的任何标准,同时也要考虑到将来需要支持的新出现的标准。这是通过一个可增强的体系结构来实现的,它首先提供一个协议和功能基础集,并允许增强的协议实现,而底层协议可作为一个整体功能模块来提供服务。图1表示了FASTPATH体系结构总体框架。



图1:FASTPATH体系结构总体框架

如果我们将核心网络协议与服务作为体系结构的一部分来设计,这将有利于我们将来集成新的协议和应用到整个系统中来。比如说,当我们设计一个IP路由子系统时,对不同路由协议如OSPF和RIP之间的路由泄漏问题的仔细考虑会暴露出一些其他的问题,如果我们能够正确地解决它们,这将使我们增加另外的路由协议变得更容易。通过为各种路由协议提供一个统一的注册接口,并向一个单一的路由表管理器(RTM)来注册,这样就建立了一个公共点,基于它可以向任何路由协议或者其他可能需要此类信息的系统模块提供新的路由信息。基于抽象API提供的这种协议框架和注册机制,程序员即使不了解底层系统,他们也能够迅速理解应该如何来对软件进行扩展以增加额外的功能。

许多网络业界经验丰富的人都知道,在产品递交给客户的那一时刻,该设备需要支持的新的协议和RFC便出现了。很多系统设计人员发现,由于Linux和开放源代码社区中存在的大量网络协议相关软件,嵌入式Linux成为了一个很有吸引力的系统操作平台选择。但是,这些软件的完整性和质量却是因组件而不同的。在很多情况下,这些软件可以提供产品质量级的功能,或者至少可以用在产品开发的前期系统原型阶段。

但是,当我们从不同的软件发布中获取组件时,必须得考虑到的一个方面就是这些组件相互之间的集成程度。虽然某些高层网络应用程序如小文件传输协议(TFTP)和网络时间协议(NTP)可以被看作是单独的应用;但是,它们仍然需要一定程度的集成以便为系统提供一个合适的统一的用户接口。在另外的情况下,如对于包括了生成树协议、802.3ad 链路汇聚协议,和动态VLAN注册协议(GVRP)等在内的L2层的以太网协议,它们必须得提供一个统一的管理接口,同时也要相互紧密结合到一起。在这些情形下,到底是使用这些最小集成度的从各种发布中得到的组件,还是使用一套由商业公司提供的紧密集成的组件,系统设计者必须仔细权衡其间的利弊。

软件的灵活性带来硬件投资的最大回报

如果网络设备供应商使用一种开放的、具备必要的接口和挂钩的软件体系结构,它允许人们添加增值功能;那么,这一平台对于最终设备制造商来说是很有吸引力的,因为它允许他们提供自己的增值特性。这样,网络设备供应商就可以只出售一个单一核心平台给那些有众多截然不同的目标市场的公司。比如说,某个公司可能定位在家庭接入市场,但是通过增加组播路由协议,它的设备也可以推销给那些定位在企业级市场的公司。确实,通过软件实现设备的可配置、可扩展和灵活性,网络设备供应商可以极大地扩展它某个给定体系结构产品的市场空间,同时也可以将软件重用到将来的产品中。由于大多数的高层功能是由软件来实现的,因而可以用最少的投资,通过简单的升级来构建设备,并在市场上不断地创造新的利润增长点