HTTP 错误 500.22 - Internal Server Error
<p>IIS7,WINDOWS2008运行.net2.0等版本程序出现这个错误。
解决方法:
HTTP 错误 500.22 - Internal Server Error
检测到在集成的托管管道模式下不适用的 ASP.NET 设置。
打开IIS,右边操作里选基本设置,应用程序池旁边点选择,选为Classic .net AppPool,就将管理模式切换为了经典模式就OK了。</p>
认识自己的无知 是认识世界最可靠的方法
<p>IIS7,WINDOWS2008运行.net2.0等版本程序出现这个错误。
解决方法:
HTTP 错误 500.22 - Internal Server Error
检测到在集成的托管管道模式下不适用的 ASP.NET 设置。
打开IIS,右边操作里选基本设置,应用程序池旁边点选择,选为Classic .net AppPool,就将管理模式切换为了经典模式就OK了。</p>
<p>一,WinSock简介
Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使 用,Socket成为当前最流行的网络通信应用程序接口之一。20世纪90年代初,由Sun Microsystems,JSB,FTP software,Microdyne和Microsoft等几家公司共同定制了一套标准,即Windows Socket规范,简称WinSock。</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>VB编写网络程序主要有两种方式:1.winsock控件 2.winsockAPI</p><p>二,WinSock控件的使用
1.WinSock控件的主要属性
a.Protocol属性
通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP对应的VB的常量分别是 sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是TCP。注意:虽然可以在运行时设置协议,但必须在连接未建 立或断开连接后。</p><p>b.SocketHandle属性
SocketHandle返回当前socket()连接的句柄,这是只读属性。</p><p>c.RemoteHostIP属性
RemoteHostIP属性返回远程计算机的IP地址。在客户端,当使用了控件的Connect方法后,远程计算机的IP地址就赋给了 RemoteHostIP属性,而在服务器端,当ConnectRequest事件后,远程计算机(客户端)的IP地址就赋给了这个属性。如果使用的是 UDP协议那么当DataArrival事件后,发送UDP报文的计算机的IP才赋给了这个属性。</p><p>d.ByteReceived属性
返回当前接收缓冲区中的字节数</p><p>e.State属性
返回WinSock控件当前的状态</p><p> 常数 值 描述
sckClosed 0 缺省值,关闭。
SckOpen 1 打开。
SckListening 2 侦听
sckConnectionPending 3 连接挂起
sckResolvingHost 4 识别主机。
sckHostResolved 5 已识别主机
sckConnecting 6 正在连接。
sckConnected 7 已连接。
sckClosing 8 同级人员正在关闭连接。
sckError 9 错误</p><p>2.WinSock主要方法
a.Bind方法
用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。</p><p>b.Listen方法
Listen方法只在使用TCP协议时有用。它将应用程序置于监听检测状态。</p><p>c.Connect方法
当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。
Connect方法调用的规范为:
Connect RemoteHost,RemotePort</p><p>d.Accept方法
当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。</p><p>e.SendData方法
当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。</p><p>f.GetData方法
当本地计算机接收到远程计算机的数据时,数据存放在缓冲区中,要从缓冲区中取出数据,可以使用GetData方法。GetData方法调用规范如下:
GetData data,type,
它从缓冲区中取得最长为maxLen的数据,并以type类型存放在data中,GetData取得数据后,就把相应的缓冲区清空。</p><p>g.PeekData方法
和GetData方法类似,但PeekData在取得数据后并不把缓冲区清空。</p><p>3.Winsock控件主要事件</p><p>a.ConnectRequest事件
当本地计算机接收到远程计算机发送的连接请求时,控件的ConnectRequest事件将会被触发。</p><p>b.SendProgress事件
当一端的计算机正在向另一端的计算机发送数据时,SendProgress事件将被触发。SendProgress事件记录了当前状态下已发送的字节数和剩余字节数。</p><p>c.SendComplete事件
当所有数据发送完成时,被触发。</p><p>d.DataArrival事件
当建立连接后,接受到了新数据就会触发这个事件。注意:如果在接受到新数据前,缓冲区中非空,就不会触发这个事件。</p><p>e.Error事件
当在工作中发生任何错误都会触发这个事件。</p><p>例子见附件</p><p>三,WinSockAPI的使用</p><p>1.WSAStartup 函数</p><p> 为了在你的应用程序当中调用任何一个Winsock API 函数,首先第一件事情你就是必须通过WSAStartup函数完成对Winsock 服务的初始化,因此需要调用WSAStartup函数。</p><p>Declare Function WSAStartup Lib "ws2_32.dll"
(ByVal wVersionRequired As Long, lpWSAData As WSAData) As Long</p><p> 这个函数有两个参数: wVersionRequired 和 lpWSAData。wVersionRequired 参数定义Windows Sockets 提供能使用的最高版本,它的高位字节定义的是次版本号,低位字节定义的是主版本号。下面的2个Winsock版本在VB中使用的例子:</p><p>初始化1.1版本</p><p>lngRetVal = WSAStartup(&H101, udtWinsockData)</p><p>初始化2.2版本</p><p>lngRetVal = WSAStartup(&H202, udtWinsockData)</p><p>第二个参数是WSADATA 的数据结构 ,它是接收Windows Sockets 执行时的数据。</p><p>Type WSAData
wVersion As Integer
wHighVersion As Integer
szDescription As String WSADESCRIPTION_LEN
szSystemStatus As String WSASYS_STATUS_LEN
iMaxSockets As Integer
iMaxUdpDg As Integer
lpVendorInfo As Long
End Type</p><p>数据成员的描述在下表中:</p><p>Field 描述
wVersion Windows Sockets 版本信息。
wHighVersion 通过加载库文件得到的最高的支持Winsock 的版本,
它通常和wVersion值相同。
szDescription Windows Sockets 执行时的详细描述
szSystemStatus 包含了相关的状态和配置的信息
iMaxSockets 表示同时打开的socket()最大数,为0表示没有限制。
iMaxUdpDg 表示同时打开的数据报最大数,为0表示没有限制。
lpVendorInfo 厂商指定信息预留</p><p>在 Winsock的1.1和2.2版本中没有lpVendorInfo的返回值。因为winsock 2支持多个传输协议,所以iMaxSockets 和iMaxUdpDg只能在仅支持TCP/TP的winsock1.1中使用。为了在Winsock 2中获得这些值,你可以使用WSAEnumProtocols 函数。</p><p>如果成功或者返回一个错误代码,则函数返回 0。</p><p>错误代码 含义
WSASYSNOTREADY 指出网络没有为传输准备好。
WSAVERNOTSUPPORTED 当前的WinSock实现不支持应用程序指定的Windows Sockets规范版本
WSAEINPROGRESS 一个阻塞WinSock调用正在进行
WSAEPROCLIM 请求的协议没有在系统中配置或没有支持它的实现存在。
WSAEFAULT lpWSAData 不是有效的指针</p><p>2.WSACleanup 函数</p><p>每次调用了WSAStartup函数,你都需要调用WSACleanup函数,通知系统来卸载库文件及清除已分配的资源,这个函数十分简单,没有任何参数:</p><p>Declare Function WSACleanup Lib "ws2_32.dll" () As Long</p><p>3.建立Socket函数</p><p>Declare Function socket() Lib "ws2_32.dll" (ByVal af As Long,
ByVal s_type As Long,
ByVal Protocol As Long) As Long</p><p>函数有3个参数定义建立何种socket,三个参数分别是:
Argument Description Enum Type
af Address family specification. AddressFamily
s_type Type specification for the new socket. SocketType
Protocol Protocol to be used with the socket SocketProtocol
that is specific to the indicated address
family.</p><p>AddressFamily:
AF_UNSPEC = 0 '/ unspecified /
AF_UNIX = 1 '/ local to host (pipes, portals) /
AF_INET = 2 '/ internetwork: UDP, TCP, etc. /
AF_IMPLINK = 3 '/ arpanet imp addresses /
AF_PUP = 4 '/ pup protocols: e.g. BSP /
AF_CHAOS = 5 '/ mit CHAOS protocols /
AF_NS = 6 '/ XEROX NS protocols /
AF_IPX = AF_NS '/ IPX protocols: IPX, SPX, etc. /
AF_ISO = 7 '/ ISO protocols /
AF_OSI = AF_ISO '/ OSI is ISO /
AF_ECMA = 8 '/ european computer manufacturers /
AF_DATAKIT = 9 '/ datakit protocols /
AF_CCITT = 10 '/ CCITT protocols, X.25 etc /
AF_SNA = 11 '/ IBM SNA /
AF_DECnet = 12 '/ DECnet /
AF_DLI = 13 '/ Direct data link interface /
AF_LAT = 14 '/ LAT /
AF_HYLINK = 15 '/ NSC Hyperchannel /
AF_APPLETALK = 16 '/ AppleTalk /
AF_NETBIOS = 17 '/ NetBios-style addresses /
AF_VOICEVIEW = 18 '/ VoiceView /
AF_FIREFOX = 19 '/ Protocols from Firefox /
AF_UNKNOWN1 = 20 '/ Somebody is using this! /
AF_BAN = 21 '/ Banyan /
AF_ATM = 22 '/ Native ATM Services /
AF_INET6 = 23 '/ Internetwork Version 6 /
AF_CLUSTER = 24 '/ Microsoft Wolfpack /
AF_12844 = 25 '/ IEEE 1284.4 WG AF /
AF_MAX = 26</p><p>Socket types:
SOCK_STREAM = 1 ' / stream socket /
SOCK_DGRAM = 2 ' / datagram socket /
SOCK_RAW = 3 ' / raw-protocol interface /
SOCK_RDM = 4 ' / reliably-delivered message /
SOCK_SEQPACKET = 5 ' / sequenced packet stream /</p><p>Protocols:
IPPROTO_IP = 0 '/ dummy for IP /
IPPROTO_ICMP = 1 '/ control message protocol /
IPPROTO_IGMP = 2 '/ internet group management protocol /
IPPROTO_GGP = 3 '/ gateway^2 (deprecated) /
IPPROTO_TCP = 6 '/ tcp /
IPPROTO_PUP = 12 '/ pup /
IPPROTO_UDP = 17 '/ user datagram protocol /
IPPROTO_IDP = 22 '/ xns idp /
IPPROTO_ND = 77 '/ UNOFFICIAL net disk proto /
IPPROTO_RAW = 255 '/ raw IP packet /
IPPROTO_MAX = 256</p><p>该函数可以建立使用特定协议的网络套接字,例如对于UDP协议可以这样写:
s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
s=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)</p><p>4.关闭Socket函数</p><p>Declare Function closesocket Lib "ws2_32.dll" (ByVal s As Long) As Long</p><p>函数有一个参数为建立socket时的Handle</p><p>5.连接函数</p><p>Declare Function connect() Lib "ws2_32.dll" (ByVal s As Long,
ByRef name As sockaddr_in,
ByVal namelen As Long) As Long</p><p>参数</p><p>s 连接的socket句柄。</p><p>name 建立连接的地址。</p><p>namelen 连接地址的长度。</p><p>返回值</p><p>成功时返回0。否则返回SOCKET_ERROR以及一个对应的错误号 Err.LastDllError。</p><p>显 然在调用这个函数时我们需要知道socket句柄,将连接的电脑的端口号和主机名称(或主机IP地址)。我们知道Winsock 控件的Connect方法依靠两个变量:RemoteHost 和RemotePort。此方法不需要socket句柄,因其已经被封装在COM对象中。你也许认为connect()函数应该也接受相同的变量设置,然 而,事实并非如此。connect()函数的主机地址和端口号的传送是依靠 sockaddr_in 结构。</p><p>Public Type sockaddr_in
sin_family As Integer
sin_port As Integer
sin_addr As Long
sin_zero(1 To 8) As Byte
End Type</p><p>6.套接字帮定函数</p><p>Declare Function bind() Lib "ws2_32.dll" (ByVal s As Long,
ByRef name As sockaddr_in,
ByRef namelen As Long) As Long</p><p>s是使用Socket函数创建好的套接字,name指向描述通信对象的结构体的指针,namelen是该结构的长度。该结</p><p>构体中的分量包括:
IP地址:对应name.sin_addr.s_addr</p><p>端口号:对应name.sin_port
端口号用于表示同一台计算机上不同的进程(即应用程序),其分配方法有两种:
第一种分配方法是,进程让系统为套接字自动分配一端口号,这只要在调用bind()前将端口号指定为0即可。由系统自动分配的端口号位于 1024~5000之间,而1~1023之间的任一TCP或UDP端口都是保留的,系统不允许任一进程使用保留端口,除非其有效用户ID是零(即超级用 户)。
第二种分配方法是,进程为套接字指定一特定端口。这对于需要给套接字分配一众所周知的端口的服务器是很有用的。指定范围在1024~65536之间。</p><p>地址类型:对应name.sin_family,一般都赋成AF_INET,表示是internet地址(即IP 地址)。IP地址通常使用点分表示法表示,但它事实上一个32位的长整数,这两者之间可通过inet_addr()()函数转换。</p><p>7.套接字监听函数</p><p>Declare Function listen Lib "ws2_32.dll" (ByVal s As Long, ByVal backlog As Long) As Long</p><p>listen函数用来设定Socket为监听状态,这种状态表明Socket准备被连接了。注意,此函数一般在服务程序上使用,其中s是使用Socket函数创建好的套接字,backlog参数用于设定等待连接的客户端数。</p><p>8.接受连接请求</p><p>Declare Function accept() Lib "ws2_32.dll" (ByVal s As Long, ByRef addr As sockaddr_in,
ByRef addrlen As Long) As Long</p><p>服务端应用程序调用此函数来接受客户端Socket连接请求,accept()()函数的返回值为一新的Socket,新Socket就可用来完成服务端和客户端之间的信息传递与接收,而原来Socket仍可以接受其他可户端的连接请求。</p><p>9.接收信息</p><p>Declare Function recv() Lib "ws2_32.dll" (ByVal s As Long,
ByRef buf As Any,
ByVal buflen As Long,
ByVal flags As Long) As Long</p><p>s 一个已连接的socket的识别符
buf 接受到的数据的缓冲区
len 缓冲区长度
flags 指定从哪调用的标识</p><p>第一个参数是socket的句柄-为socket函数返回值。那就是说:我们需要告诉recv()函数,哪一个socket正访问函数。</p><p>第 二个参数是:函数执行之后能装载一些数据的缓冲区。但它不是必须要有足够的长度接收Winsock缓冲区的所有数据,缓冲区的大小限制为8192 字节 (8 Kbytes)。因此如果Winsock缓冲区的数据的大小大于recv()函数的缓冲区,你必需多次调用此函数,直到获取所有的数据。</p><p>如果应用程序定义缓冲区的长度,则recv函数必须知道缓冲区可以存放多少字节。第三个参数就是为了这个目的。</p><p>最后一个参数是可选的,今天我们不使用。该参数有两个选择标志: MSG_PEEK 和 MSG_OOB,用于改变函数的行为。</p><p>MSG_PEEK 从输入数据中取数。数据拷入缓冲区,但不从输入队列中移走。函数返回当前准备接收的字节数。
MSG_OOB 处理OOB(Out-of-band带外)数据。在网络上有两种类型的数据包,正常包和带外包。带外包可以通过检验一个TCP/IP包头的一个特定标志来决定。</p><p>10.发送信息</p><p>Declare Function send Lib "ws2_32.dll" (ByVal s As Long,
ByRef buf As Any,
ByVal buflen As Long, _
ByVal flags As Long) As Long</p><p>参数参看接收信息</p><p>四,服务器与客户机交互</p><p> 目前最常用的方法是:服务程序在一个众所周知的地址(其中包括端口信息)监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务 的地址提出了连接请求。这个时刻,服务程序被唤醒并对客户的请求作出适当的反应。注意,服务器与客户机之间的交互可以是面向连接的(基于流套接字),也可 以是无连接的(基于数据报套接字)。</p><p>服务器</p><p> socket()
|
bind()()
|
listen() 客户机
|
| socket()
| 建立连接 |
accept()() <------------------------- connect()
| 请求数据 |
recv() <----------------------------- send()
| |
处理服务请求 |
| 应答数据 |
send() ------------------------------> recv()
| |
close() close()</p><p>五,其他</p><p>比较:WinSock控件
优点:使用简单,工作量小。
缺点:功能少仅支持TCP,UDP协议,需要WinSock控件(系统默认安装不带MSWINSCK.OCX文件)
适合于初学者
WinSockAPI
优点:功能强大,支持多种协议,使用灵.活,WinSockAPI调用的wsock32.dll(28K)或ws2_32.dll(69K)为Windows系统自带函数库不必担心缺少文件。
缺点:使用复杂,编程量大,需要一定基础
适合于要求较高的网络程序.</p>
要使程序可以运行必须引入JSON-lib包,JSON-lib包同时依赖于以下的JAR包:
commons-lang.jar
commons-beanutils.jar
commons-collections.jar
commons-logging.jar
ezmorph.jar
json-lib-2.2.2-jdk15.jar
<p>端口</p><p>WAMP装好之后默认的端口是80,但是这个80端口呢,可以热门端口啊,迅雷,IIS都挺喜欢,在WIN7下本来还有1个进程也点80,让人伤脑筋啊,所以把它改掉,方法如下:</p><p>一、修改APACHE的监听端口, </p><p> 1、在界面中选apache,弹出隐藏菜单选项,打开配置文件httpd.conf;</p><p> 2、找到Listen 80 和 ServerName localhost:80;</p><p> 3、将80改成801(当然自己也可以设定别的不使用的端口,例如8000等);</p><p> 4、保存,待重启WAMP服务后即可。</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>二、修改WAMP打开默认页 Localhost和phpMyadmin的端口:</p><p> 1、打开wamp目录下wampmanager.tpl文件</p><p> 2、找到</p><p> Parameters: "http://localhost/"; Glyph: 5</p><p> Parameters: "http://localhost/phpmyadmin/"; Glyph: 5 </p><p> 3、改成</p><p> Parameters: http://localhost:801/; Glyph: 5</p><p> Parameters: "http://localhost:801/phpmyadmin/"; Glyph: 5</p><p> 4、保存,重启wamp所有服务即可。</p><p> phpmyadmin使用wamp5启动提示密码错误,一般发生在曾经配置过php+apache的机器上,如果记得密码,可以通过以下的方式修改wamp5中phpmyadmin的默认设置,使服务正常。</p><p> 修改phpmyadmin的默认密码:</p><p> 1、进入安装盘符下wampapps下的phpmyadmin文件夹</p><p> 2、打开config.inc文件</p><p> 3、找到 </p><p> $cfg['Servers'][$i]['user'] = 'root';</p><p> $cfg['Servers'][$i]['password'] = '这里填写你的密码';</p><p> 4、修改好你的密码,保存即可。</p>
着手写这篇文章时,正是七月伊始。想起九十五年前的七月,胡适先生发表了那篇在接下来的一个世纪都将遭受批判的文章《多研究些问题,少谈些主义》。其时的中国,正被各种社会问题所困扰,也引发了学界对于各种"主义"的主张。针对这些主义,胡适阐明了自己的态度
现在舆论界大危险,就是偏向纸上的学说,不去实地考察中国今日的社会需要究竟是什么东西……某种社会,到了某时代,受了某种的影响,呈现某种不满意的现 状。于是有一些有心人,以这种现象,想出某种救济的法子。这是"主义’的原起。主义初起时,大都是一种救时的具体主张。后来这种主张传播出去,传播的人要 图简便,使用一两个字来代表这种具体的主张,所以叫他做‘"某某主义"。主张成了主义,便由具体的计划,变成一个抽象的名词。……"主义"的大危险,就是 能使人心满意足,自以为寻着包医百病的"根本解决",从此用不着费心力去研究这个那个具体问题的解决法了。
<div><p>//首先要说明的是与TopMost的效果不同,TopMost是属性定义,而且设置True后,如果不设为Flase则一直置顶,效果很差,</p><p>//以下方法解决了TopMost使用上的不足</p><p>//调用API
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow(); //获得本窗体的句柄
[System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]
public static extern bool SetForegroundWindow(IntPtr hWnd);//设置此窗体为活动窗体
//定义变量,句柄类型
public IntPtr Handle1;</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>//在窗体加载的时候给变量赋值,即将当前窗体的句柄赋给变量</p><p>void Form1_Load(object sender, EventArgs e)
{
Handle1 = this.Handle;
timer2.Enabled = true;
}</p><p>//加载一个定时器控件,验证当前WINDOWS句柄是否和本窗体的句柄一样,如果不一样,则激活本窗体</p><p>private void timer2_Tick(object sender, EventArgs e)
{
if (Handle1 != GetForegroundWindow()) //持续使该窗体置为最前,屏蔽该行则单次置顶
{
SetForegroundWindow(Handle1);</p><p>//timer2.Stop();//此处可以关掉定时器,则实现单次置顶
}
}</p><pre>namespace WinFormsApp_GetForegroundWindowTest</pre><pre>{</pre><pre>publicpartialclass Form1 : Form</pre><pre> {</pre><pre>//调用API</pre><pre> [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, ExactSpelling = true)]</pre><pre>publicstaticextern IntPtr GetForegroundWindow(); //获得本窗体的句柄</pre><pre> [System.Runtime.InteropServices.DllImport("user32.dll", EntryPoint = "SetForegroundWindow")]</pre><pre>publicstaticexternbool SetForegroundWindow(IntPtr hWnd);//设置此窗体为活动窗体</pre><pre>//定义变量,句柄类型</pre><pre>public IntPtr Handle1;</pre><pre> Timer timer2 = new Timer();</pre><pre> </pre><pre>public Form1()</pre><pre> {</pre><pre> InitializeComponent();</pre><pre> }</pre><pre> </pre><pre> Form Form2;</pre><pre> </pre><pre>//在窗体加载的时候给变量赋值,即将当前窗体的句柄赋给变量</pre><pre>void Form1_Load(object sender, EventArgs e)</pre><pre> {</pre><pre> Handle1 = this.Handle;</pre><pre> timer2.Tick += new EventHandler(timer2_Tick);</pre><pre> timer2.Interval = 1000;</pre><pre> }</pre><pre> </pre><pre>//加载一个定时器控件,验证当前WINDOWS句柄是否和本窗体的句柄一样,如果不一样,则激活本窗体</pre><pre>privatevoid timer2_Tick(object sender, EventArgs e)</pre><pre> {</pre><pre>//if (Handle1 != GetForegroundWindow()) //持续使该窗体置为最前,屏蔽该行则单次置顶</pre><pre>//{</pre><pre> SetForegroundWindow(Handle1);</pre><pre> timer2.Stop();//此处可以关掉定时器,则实现单次置顶</pre><pre>//}</pre><pre> }</pre><pre> </pre><pre>privatevoid btnSetForm2ToTop_Click(object sender, EventArgs e)</pre><pre> {</pre><pre>if (Form2 == null) return;</pre><pre> </pre><pre> timer2.Enabled = true;</pre><pre> Handle1 = Form2.Handle;</pre><pre> }</pre><pre> </pre><pre>privatevoid btn_OpenForm2_Click(object sender, EventArgs e)</pre><pre> {</pre><pre> Form2 = new Form();</pre><pre> Form2.Text = "Form2";</pre><pre> Form2.Show();</pre><pre> }</pre><pre> }</pre><pre>}</pre></div>
<p>乌龟SVN官方网站</p><p>http://tortoisesvn.tigris.org/ </p><p>http://tortoisesvn.net/index.zh.html <--- 点这里</p><p>SVN服务器搭建和使用(一)</p><p>http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html</p><p>SVN服务器搭建和使用(二)</p><p>http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407979.html</p><p>TortoiseSVN客户端重新设置用户名和密码</p><p>http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2408089.html</p><p>SVN服务器搭建和使用(三)</p><p>http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2408089.html</p>
<div><p>1、软件</p><p>1)服务端:Subversion</p><p>subversion.apache.org - Getting Subversion - Binary Packages - Windows - Win32Svn - Files - 1.6.16 - svn-win32-1.6.16.zip</p><p>解压svn-win32-1.6.16.zip到C:My Program Files</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>2)客户端:TortoiseSVN</p><p>tortoisesvn.tigris.org - tortoisesvn.net/downloads - TortoiseSVN 32-bit - downloads.sourceforge.net/tortoisesvn/TortoiseSVN-1.6.15.21042-win32-svn-1.6.16.msi</p><p>直接安装</p><p>2、步骤</p><p>1)添加C:My Program FilesSubversionbin到环境变量(貌似不一定需要)</p><p>2)新建目录E:svn_repositorysvn</p><p>3)进入E:svn_repositorysvn - 右键 - TortoiseSVN - creat repository here</p><p>或者在cmd下输入以下命令:</p><p>C:My Program Filessvn-win32-1.6.16binsvnadmin create E:svn_repositorysvn</p><p>4)文本打开E:svn_repositorysvnconfsvnserve.conf - 修改“# password-db = passwd”为“password-db = passwd”</p><p>5)文本打开E:svn_repositorysvnconfpasswd - 添加用户“root = pwd”</p><p>6)添加系统服务:cmd下(命令行中等号前不能有空格,等号后必须有空格)</p><p>C:>sc create svnserver binpath= "C:My Program Filessvn-win32-1.6.16binsvnserve.exe --service --root E:svn_repository" displayname= "svnserver" depend= tcpip start= auto obj= "NT AUTHORITYNetworkService"</p><p>[SC] CreateService SUCCESS</p><p>7)svn的使用不说了</p><p>3、可能遇到的问题</p><p>1)在commit的时候出现错误“不能打开文件“E:svn_repositorysvndbtxn-current-lock”: 拒绝访问。”</p><p>解决办法:为E:svn_repository目录设置写权限,用户组"Administrator/Users"需要有修改、写入权限。</p><p>打开E:svn_repository目录 - 工具 - 文件夹选项 - 查看 - 不要选中“使用简单文件共享” - 确定 - 右击空白处 - 属性 - 安全 - 选中Users组 - 在“允许”下勾选“修改”和“写入”</p><p>2)Windows 7下添加系统服务时出现 "[SC] OpenSCManager 失败 5:" 错误</p><p>解决方法:开始——所有程序——附件——(右键)命令提示符——以管理员身份运行</p><p>3)启动服务时出现“错误5 拒绝访问”</p><p>解决方法:为C:My Program Filessvn-win32-1.6.16文件夹添加user用户使用权限</p><p>右击文件夹——属性——安全——添加“users”用户——权限默认即可</p><p>4)启动服务时出现“错误 1053”</p><p>检查是否创建了E:svn_repository文件夹</p><p>4、其他</p><p>1)删除服务</p><p>C:>sc delete svnserver</p></div>