您的位置:首页 > 其它

有关Libssh2的Win32程序开发中遇到的若干问题的汇总 .

2014-05-04 10:00 716 查看
有关Libssh2的Win32程序开发中遇到的若干问题的汇总
前不就,在工作中编写了一个应用libssh2开源库的win32控制台应用程序,libssh2是一个开源的c/c++的ssh2协议库,应用libssh2协议库可以很容易的编写出一个通过ssh2协议连接远程主机的client程序。但是在开发的过程中遇到了很多的问题,使我走了很多的弯路。现在总结一下,对别人也是个启示。

首先、我是按照网上《搭建ssh2协议的开发环境:openssl+libssh2库+Visual
Studio 2008》这篇博客搭建的libssh2开发环境。在这一过程中我遇到了几个问题:

1、
在这篇博客文章中有几处错误需要改正(见下图所示),在图中的”/”符号在windows系统下编译应该改成”\”,否则系统不认。



2、 博客文章中的此版本(ActivePerl-5.10.0.1005-MSWin32-x86-290470.msi)的msi已经无法下载了,我使用的是ActivePerl-5.10.1.1006-MSWin32-x86-291086这个版本的,最后也编译成功了。我想只要是ActivePerl-5.10这个主版本号一致应该都行吧。

3、在用ActivePerl-5.10.1.1006-MSWin32-x86-291086这个版本编译的时候,有可能会遇到“error:将警告视为错误”,如果是这样的话请在执行完ms/do_masm这一步后将ms/nt.mak中的”/wx”去掉,然后再执行nmake –f ms/nt.mak这一步就Ok了。

4、我最开始用的是Win7_64bite的操作系统和vs2010进行编译,结果不成功,报了与64位相关的错误后来我又换回WinXP和vs2008.至于Win7_64Bit操作系统和Vs2010进行编译libssh2库还需要探索一下。

其次、Libssh2的版本也很重要,关于Libssh2的版本问题我还想再啰嗦几句:

1、 按照博客文章中编译成功的是libssh2-1.1版本,而www.libssh2.org中给出的好多示例中的libssh函数在Libssh2-1.1中都没有,在编译程序的时候编译器会不认,请多多注意注意。在编程的过程中最好是参考libssh2-1.1源码包中的文档和示例。

2、Libssh2-1.1版本比较原始和粗糙,不怎么好用,所以编译更高级别版本的libssh2库还是很重要的。

第三、注意差异性:

1、因为Libssh2库最初是给linux系统编写的,在window上应用编译好的libssh2库时,在参考Libssh2的示例时请仔细的思考斟酌,考虑linux和windows两者的差异,在我编程的过程中我发现示例中的select函数在我的win32编程中就不起作用,浪费了我好多的时间。

2、zlib在安装时如果是WinXP请将zlib放在c:/windows/system32文件夹下,如果是Win7请将zlib放在c:/windows/system文件夹下。

第四、在我进行libssh2的win32编程时,遇到最多的是在编程的过程中出现的问题:

1、不能交互

不能交互是我一开始遇到的最大的问题,每次都是我发完第一个命令之后,程序能很好的接收,但是当接收完之后,就停在哪里了,不能再次发送命令了,总之是不能像putty式的一发一收,一发一收,查询相关的资料网上又没有,偶尔能查到点,也是之言片语。没办法我就只能不断的随机尝试。终于一次偶然的机会,让我解决了这个问题,于是我才明白ssh2阻塞在read上了,原来每次读写都要进行状态判断才行。好在libssh2库提供了一个好用的函数(libssh2_poll())。

2、
遇到收集或显示特别多的数据时需要调整channel的缓存大小

我还遇到了一次在接收show tec命令的信息时,我的程序总是在中途卡主,而且每次都是同一个地方,而其他的命令就没问题,当时我就意识到可能是show tec吐出的信息数据量太大的缘故,后来我查了一下www.libssh2.org上的邮件列表之后证实了我的猜测,然后我就使用了libssh2_channel_receive_window_adjust()这个函数,每次数据量过大的时候,就调整channel的缓存,最后问题就解决了。

3、 阻塞问题

还有ssh2在read的时候还经常被阻塞,www.libssh2.org上说阻塞这不是错误。我在多次试验之后,也才觉得阻塞不是错误。只要让程序Sleep(2000)再重新读就行了,如果还阻塞,就在睡眠。不断循环就行了。

4、 加“\n”结尾的问题

在每个发送的命令的结尾要加上“\n”,只有这样在命令被推倒Server端时,Server才会执行,否则Server老是等着发送命令的结束,它会认为你还有命令字符没有到达。

总之,我希望正在应用libssh2的朋友如果还在遇到跟我有相同的问题,我上面写的希望能够提供一些启示和帮助,哪怕有些许的帮助我就心满意足了。另外我还上传了一份我自己写的简单的示例的源代码,它是一个简单的cmd窗口功能,能实现接收、发送和显示数据。希望应用libssh2进行编程的的朋友能有所帮助。

附录:本文中的《搭建ssh2协议的开发环境:openssl+libssh2库+Visual
Studio 2008》这篇博客来自这个网址:/article/11805686.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: