Dict.CN 在线词典, 英语学习, 在线翻译

原文地址:
http://www.codeproject.com/webservices/ifs.asp

第一次翻译,还只是翻译了部分文章。

作者最近好像还有更新。


这是一个p2p软件,全称Internet File System,网络文件系统。是基于WebService实现的。实现的功能是:可以把自己的文件注册到网络上,让大家共享。
全文205k,我实在没有勇气去翻译。捡几个重要的部分介绍一下。

1:结构:
  peer 一个使用端,可以发布自己的文件让其网络共享,也可以获取一个声明为发布的文件到本地。
  Server 静态单一(singleton)的服务端,设有WebService。
  WebService:这个软件就是靠它实现p2p的了。定义?自己查吧。

2:使用方法:
  注册--〉登陆--〉可以查看获取网络文件/发布自己的文件。

3:Server是把每个使用端声明为发布的文件的(基本信息+发布用户端机器信息)注册到DB里面。诸如 文件名,文件所在文件夹名,大小,发布者信息(ip,port),虚拟目录名(好像是ifs自己的目录)

4:防火墙和“推”“拉”。
  事先定义:请求需要下载文件f的一端叫做p1,这个文件的所有者叫p2,服务器叫s。  考虑这四种情况:
  a:p1和p2都不在防火墙里面。也就是说p1和p2时可以互相看见的。这时候,下载文件的流程是这样的:p1登陆到s,获取f的基本信息。p1可以从这个信息里面获取f的所有者p2的一些基本信息,如ip,端口号,是否在火墙里等。既然p2部在火墙里面,p1就可以直接向p2(知道了他的endponit,that is ip+port)发送一个pull的命令.pull,简单的翻译为“拉”。即p1从p2的机器上直接找到文件,下载。
  b:p1不在火墙里,p2在火墙里面。这时候,p1是无法找到p2的。如何实现下载呢?方法叫做“Push”,简单的翻译为“推”。因为p1不在火墙里面,所以p2时可以访问到p1的。操作流程是这样的:p1登陆s,获取f的所有者p2的信息,发现在火墙里面,于是乎,p1向s发出请求,附加一个Push文件的Task给p2,p2的一个线程获取这个Task和p1的endpoint,然后p2主动向p1发送文件f。当然了,p1在发送了Push的请求之后,就准备接受文件了。
  c:p1在火墙里,p2不在火墙里。很容易,和第一种情况一样。
  d:p1和p2都在火墙里。这就意味着p1和p2都是不可见的。这时候,该s出马了。p1首先会像s发出一个请求Task,p2接受,但是发现p1也在墙里,so,p2把文件upload到s上面的一个空间上,上传结束后,通知p1(当然是通过s中转这个消息了),p1开始到s上找到这个空间,开始下载文件。



第一次看这么长的c++代码。我在看源码的时候,看到的一些重要的东东。

1:__gc*:声明为回收类型
2:PushCommand,PullCommand:for what?

3:public __value enum TaskType : unsigned char
PushFile = 1,    //
DownloadFile = 2, // unimplemented
UploadFile = 3 // ditto

4:S"Press ENTER to stop the server..."//to String type
5: class P2PConfig. use to manage the xml config file which log the very info for system. the file name is 'IFS.P2P.xml'
<?xml version="1.0" encoding="UTF-16"?>
<p2pconfig>
  <item key="PeerID">851966d6-35d0-4d08-b251-9641d3616b63</item>
  <item key="IpAddress">127.0.0.1</item>
  <item key="Port">12000</item>
  <item key="P2PFmkNamespace">InternetFileSystem.P2PFramework</item>
  <item key="ThreadSleepTime">100</item>
  <item key="ThreadJoinTime">1000</item>
  <!-- poll for tasks each 10 minutes -->
  <item key="TaskPollInterval">600000</item>
</p2pconfig>
6:class NetHelper.use to manage all the net transport task.include 'Connect' to a IPEndPoint,'Close','WriteLine' by BufferSize=1024,'Read/WriteArray', and so on.
7:works only if the remote peer is not behind firewall
8:PublishFile.there are several situation for PublishFile:'PublishFile','PublishFileHere'. use virtualFolderPath
9:properties of a peer
String __gc* id;
String __gc* login;
String __gc* password;
String __gc* alias;
String __gc* ipEndPoint;
System::Boolean behindFirewall;
10:use WebService.//a funny file 'IFSWebService.wsdl'
11:interface ICommandExecutor (PeerCommand __gc* command,NetHelper __gc* netHelper)
12:like '3',what's meaning of 'Pull'and'Push','Peer'and'Library'?
        PeerPull = 0, // issued FROM a remote peer
PeerPush = 1, // ditto
LibraryPush = 2, // issued from the library
LibraryPull = 3, // ditto

Download = 4, // UNSUPPORTED in this version
Upload = 5, // ditto
13:properties of Server
int port;
ServerStatus status;
TcpListener __gc* listener;
Thread __gc* p2pThread;
int threadSleepTime;
int threadJoinTime;
String __gc* namespaceName;
Thread __gc* taskThread;
// the "int" can handle about a month time
int taskPollInterval;
String __gc* peerID;
IFSWebService __gc* webService;
14:class ServerManager have 3 method:SendPushCommand,SendPullCommand,SendMessage.why  send the two commands?

posted @ 2010-11-02 15:07 无名-小卒 阅读(116) 评论(0) 编辑

先记录下过程:

1。修改配置文件

<system.web>
<!-- 让其在跨站点访问时,使SESSION能共用 -->
<httpCookies domain="CSDN.Net" />
<!-- 设置Session模式为SQLServer -->
<sessionState mode="SQLServer" sqlConnectionString="Data Source=127.0.0.1;User ID=ASPState;Password=ASPState;" timeout="60" />
</system.web>
2。修改 ASPState的TempGetAppID存储过程,让不同的站点保持同一个AppId。

因为实在找不到可以自定义AppName的方法,只有出此下策了。

/**//*

获取AppId

修改过程,使其只生成一个AppId

*/
CREATE PROCEDURE dbo.TempGetAppID
@appName tAppName,
@appId int OUTPUT
AS

SET @appName = LOWER(@appName)
SET @appId = NULL

--查询AppName对应的AppId
--次处进行了修改,使每个AppId都是一样.
SELECT top 1 @appId = AppId
FROM [tempdb].dbo.ASPStateTempApplications
--WHERE AppName = @appName

--如果没有查询到AppId
IF @appId IS NULL
BEGIN
BEGIN TRAN
--锁定模式查询
SELECT @appId = AppId
--SELECT top 1 @appId = AppId
FROM [tempdb].dbo.ASPStateTempApplications WITH (TABLOCKX)
WHERE AppName = @appName

--如果没有查询到AppId
IF @appId IS NULL
BEGIN
--获取AppName的HashCode
EXEC GetHashCode @appName, @appId OUTPUT

--插入新AppId
INSERT [tempdb].dbo.ASPStateTempApplications
VALUES
(@appId, @appName)

IF @@ERROR = 2627
BEGIN
DECLARE @dupApp tAppName

SELECT @dupApp = RTRIM(AppName)
FROM [tempdb].dbo.ASPStateTempApplications
WHERE AppId = @appId

RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.',
18, 1, @appName, @dupApp)
END
END
COMMIT
END

RETURN 0
GO

 

网上有很多方式,但都不是我的环境所需要的

1。修改站点的IIS元数据
IIS站点有不同的Id(/LM/W3SVC/1009009583/Root,ID是1009009583,一般通常是1),此方法适合多服务器间的站点集群(同一台服务器上把站点ID修改为相同为出现站点错乱)。
有关解决服务器之间应用程序路径不同的问题的步骤信息,请参见位于 http://support.microsoft.com/default.aspx?ln=zh-cn 上的 Microsoft 知识库中的文章 325056“PRB: Session State Is Lost in Web Farm If You Use SqlServer or StateServer Session Mode”(PRB:如果使用 SqlServer 或 StateServer 会话模式则会在网络场中丢失会话状态)。

posted @ 2009-04-22 17:31 无名-小卒 阅读(309) 评论(0) 编辑

因为公司有多台服务器,所以session要保存在sql server上,因此要在数据库中建立存放session的数据库ASPState,

在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727下找到了生成ASPState的sql:InstallSqlState.sql

马上打开,放到查询分析器里执行,怪了,在这里出问题了,报出了如下错误:

 
-----------------------------------------
Starting execution of InstallSqlState.SQL
-----------------------------------------
--------------------------------------------------
Note:                                            
Do not run this file manually.                   
You should use aspnet_regsql.exe to install      
and uninstall SQL session state.                 
 
Run 'aspnet_regsql.exe -?' for details.        
--------------------------------------------------
If the job does not exist, an error from msdb.dbo.sp_delete_job is expected.
消息 14262,级别 16,状态 1,过程 sp_verify_job_identifiers,第 67 行
指定的 @job_name ('ASPState_Job_DeleteExpiredSessions')不存在。
If the category already exists, an error from msdb.dbo.sp_add_category is expected.
消息 14261,级别 16,状态 1,过程 sp_add_category,第 32 行
指定的 @name ('[Uncategorized (Local)]')已存在。
 
------------------------------------------
Completed execution of InstallSqlState.SQL
------------------------------------------

这段里说要运行aspnet_regsql.exe 来创建,为什么要这样搞呢?

于是打开VS2005命令提示,输入:aspnet_regsql.exe -?

出现了aspnet_regsql.exe的说明,往下拉会看到"会话状态选项",有一命令:-ssadd(Session state add?) 解释说:添加对 sqlserver 模式会话状态的支持.

估计就是这个了,输入: aspnet_regsql.exe -ssadd

提示:请指定用户ID,或对受信任的连接使用-E

输入如下:aspnet_regsql.exe -ssadd -E

成功.

 

也可以指定用户名:aspnet_regsql.exe -ssadd -U sa

会提示输入密码.正确输入后也会执行成功.

 

删除该功能的话执行aspnet_regsql.exe -ssremove -E

就OK了.

 

 

本博客内容公供学习研究用,和工作内容无关.
posted @ 2009-04-22 16:45 无名-小卒 阅读(470) 评论(0) 编辑
摘要: 阅读全文
posted @ 2009-01-13 11:38 无名-小卒 阅读(588) 评论(1) 编辑
摘要: (计算机世界报 2008年09月08日第34期 40) 2008-09-06 18:19:57 与P2P随机挑选资源点不同,P4P协议(Proactive network Provider Participation for P2P)可以利用网络拓扑数据,选择最佳的资源点,从而提高网络路由效率。 阅读全文
posted @ 2009-01-12 11:45 无名-小卒 阅读(184) 评论(0) 编辑
摘要: 一:基本术语 防火墙 防火墙限制了私网与公网的通信,它主要是将(防火墙)认为未经授权的的包丢弃,防火墙只是检验包的数据,并不修改数据包中的IP地址和TCP/UDP端口信息。 网络地址转换(NAT) 当有数据包通过时,网络地址转换器不仅检查包的信息,还要将包头中的IP地址和端口信息进行修改。以使得处于NAT之后的机器共享几个仅有的公网IP地址(通常是一个)。网络地址转换器主要有两种类型. P2P应用程序 P2P应用程序是指,在已有的一个公共服务器的基础上,并分别利用自己的私有地址或者公有地址(或者两者兼备)来建立一个端到端的会话通信。 P2P防火墙 P2P防火墙是一个提供了防火墙的功能的P2P代理,但是不进行地址转换. P2P-NAT P2P-NAT 是一个 P2P代理,提供了NAT的功能,也提供了防火墙的功能,一个最简的P2P代理必须具有锥形NAT对Udp通信支持的功能,并允许应用程序利用Udp打洞技术建立强健的P2P连接。 回环转换 当NAT的私网内部机器想通过公共地址来访问同一台局域网内的机器的时,NAT设备等价于做了两次NAT的事情,在包到达目标机器之前,阅读全文
posted @ 2009-01-12 11:16 无名-小卒 阅读(555) 评论(0) 编辑

OPENROWSET

包含访问 OLE DB 数据源中的远程数据所需的全部连接信息。当访问链接服务器中的表时,这种方法是一种替代方法,并且是一种使用 OLE DB 连接并访问远程数据的一次性的、特殊的方法。可以在查询的 FROM 子句中像引用表名那样引用 OPENROWSET 函数。依据 OLE DB 提供程序的能力,还可以将 OPENROWSET 函数引用为 INSERT、UPDATE 或 DELETE 语句的目标表。尽管查询可能返回多个结果集,然而 OPENROWSET 只返回第一个。

语法

OPENROWSET ( 'provider_name'
    , { 'datasource' ; 'user_id' ; 'password'

        | 'provider_string' }
    , { [ catalog.] [ schema.] object
        | 'query' }
    )

参数

'provider_name'

字符串,它代表在注册表中指定的 OLE DB 提供程序的友好名。provider_name 没有默认值。

'datasource'

字符串常量,它对应着某个特定的 OLE DB 数据源。datasource 是将被传递到提供程序 IDBProperties 接口以初始化提供程序的 DBPROP_INIT_DATASOURCE 属性。通常,这个字符串包含数据库文件的名称、数据库服务器的名称,或者提供程序能理解的用于查找数据库的名称。

'user_id'

字符串常量,它是传递到指定 OLE DB 提供程序的用户名。user_id 为连接指定安全上下文,并将它作为 DBPROP_AUTH_USERID 属性传递进来以初始化提供程序。

'password'

字符串常量,它是将被传递到 OLE DB 提供程序的用户密码。当初始化提供程序时,将 password 作为 DBPROP_AUTH_PASSWORD 属性传递进来。

'provider_string'

提供程序特定的连接字符串,将它作为 DBPROP_INIT_PROVIDERSTRING 属性传递进来以初始化 OLE DB 提供程序。通常 provider_string 封装初始化提供程序所需的所有连接信息。

catalog

目录或数据库的名称,其中驻留着指定的对象。

schema

架构的名称或指定对象的对象所有者名称。

object

对象名称,它唯一地标识出将要操作的对象。

'query'

是字符串常量,发送到提供程序并由提供程序执行。Microsoft® SQL Server™ 不处理该查询,但处理由提供程序返回的查询结果(直接传递查询)。对于有些提供程序,它们并没有通过表名而是通过命令语言表现自己的表格格式数据,那么将直接传递查询用于这些提供程序是非常有用的。只要查询提供程序支持 OLE DB Command 对象及其强制接口,那么在远程服务器上就支持直接传递查询。有关更多信息,请参见 SQL Server OLE DB 程序员参考

注释

如果 OLE DB 提供程序在指定的数据源中支持多个目录和架构,那么就需要目录及架构名称。如果 OLE DB 提供程序并不支持目录和架构,那么可以省略 catalog schema 的值。

如果提供程序只支持架构名,那么必须指定一个两部分名称,形式为 schema.object。如果提供程序只支持目录名,那么必须指定一个三部分名称,形式为 catalog.schema.object

OPENROWSET 不接受参数变量。

权限

OPENROWSET 权限由传递到 OLE DB 提供程序的用户名的权限确定。

示例
A. 将 OPENROWSET 与 SELECT 语句及用于 SQL Server 的 Microsoft OLE DB 提供程序一起使用

下面的示例使用用于 SQL Server 的 Microsoft OLE DB 提供程序访问 pubs 数据库中的 authors 表,该数据库在一个名为 seattle1 的远程服务器上。从 datasourceuser_idpassword 中初始化提供程序,并且使用 SELECT 语句定义返回的行集。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('SQLOLEDB','seattle1';'sa';'MyPass',
   'SELECT * FROM pubs.dbo.authors ORDER BY au_lname, au_fname') AS a
GO
B. 将 OPENROWSET 与对象及用于 ODBC 的 OLE DB 提供程序一起使用

下面的示例使用用于 ODBC 的 OLE DB 提供程序以及 SQL Server ODBC 驱动程序访问 pubs 数据库中的 authors 表,该数据库在一个名为 seattle1 的远程服务器中。提供程序用在 ODBC 提供程序所用的 ODBC 语法中指定的 provider_string 进行初始化,定义返回的行集时使用 catalog.schema.object 语法。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('MSDASQL',
   'DRIVER={SQL Server};SERVER=seattle1;UID=sa;PWD=MyPass',
   pubs.dbo.authors) AS a
ORDER BY a.au_lname, a.au_fname
GO
C. 使用用于 Jet 的 Microsoft OLE DB 提供程序

下面的示例通过用于 Jet 的 Microsoft OLE DB 提供程序访问 Microsoft Access Northwind 数据库中的 orders 表。


说明
  下面的示例假定已经安装了 Access。

USE pubs
GO
SELECT a.*
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
   'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders) 
   AS a
GO
D. 使用 OPENROWSET 和 INNER JOIN 中的另一个表

下面的示例从本地 SQL Server Northwind 数据库的 customers 表中,以及存储在相同计算机上 Access Northwind 数据库的 orders 表中选择所有数据


说明
  下面的示例假定已经安装了 Access。

USE pubs
GO
SELECT c.*, o.*
FROM Northwind.dbo.Customers AS c INNER JOIN 
   OPENROWSET('Microsoft.Jet.OLEDB.4.0', 
   'c:\MSOffice\Access\Samples\northwind.mdb';'admin';'mypwd', Orders) 
   AS o
   
posted @ 2009-01-09 10:34 无名-小卒 阅读(234) 评论(0) 编辑
摘要: 固定电话、小灵通【无条件转移】设定:*57*电话号码#   取消:#57#【无应答转移】设定:*41*电话号码#   取消:#41#【遇忙转移】 设定:*40*电话号码#   取消:#40# GSM手机【无条件转移】设定:**21*电话号码#  取消:##21#【无应答转移】设定:**61*电话号码#  取消:##61#【遇忙转移】 设定:**67*电话号码#  取消:##67# CDMA手机【无...阅读全文
posted @ 2008-11-06 09:37 无名-小卒 阅读(602) 评论(0) 编辑
摘要: 转: C#开发终端式短信的原理和方法阅读全文
posted @ 2008-10-20 10:20 无名-小卒 阅读(111) 评论(0) 编辑
posted @ 2008-10-17 12:49 无名-小卒 阅读(302) 评论(0) 编辑