2005年05月24日

Hook可真是一个了不起的家伙,它有时令人又爱又怕!那么什么是Hook呢?原来呀,它是用来拦截系统某些信息之用,例如说,我们想让系统不管在什麽地方只要按个Ctl-N便执行NotePad,或许您会使用Form的KeyPreview ,设定为True,但在其他Process中按Ctl-N呢?那就没有用,这时就得设一个Keyboard Hook来拦截所有Key in的键;再如:MouseMove的Event只在该Form或Control上有效,如果希望在Form的外面也能得知Mouse Move的信息,那只好使用Mouse Hook来栏截Mouse 的信息。Hook呢,可以是整个系统为范围(Remote Hook),即其他 Process的动作您也可以拦截,也可以是LocalHook,它的拦截范围只有Process本身。 Remote Hook的Hook Function要在.Dll之中,Local Hook则在.Bas中。

  在VB如何设定Hook呢?使用SetWindowsHookEx()

  Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA"(ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long

  idHook代表是何种Hook,有以下几种


Public Const WH_CALLWNDPROC = 4
Public Const WH_CALLWNDPROCRET = 12
Public Const WH_CBT = 5
Public Const WH_DEBUG = 9
Public Const WH_FOREGROUNDIDLE = 11
Public Const WH_GETMESSAGE = 3
Public Const WH_HARDWARE = 8
Public Const WH_JOURNALPLAYBACK = 1
Public Const WH_JOURNALRECORD = 0
Public Const WH_KEYBOARD = 2
Public Const WH_MOUSE = 7
Public Const WH_MSGFILTER = (-1)
Public Const WH_SHELL = 10
Public Const WH_SYSMSGFILTER = 6

  lpfn代表Hook Function所在的Address,这是一个CallBack Fucnction,当挂上某个Hook时,我们便得定义一个Function来当作某个信息产生时,来处理它的Function,这个Hook Function有一定的参数格式

  Private Function HookFunc(ByVal nCode As Long,ByVal wParam As Long, ByVal lParam As Long ) As Long

  nCode 代表是什麽请况之下所产生的Hook,随Hook的不同而有不同组的可能值wParam lParam 传回值则随Hook的种类和nCode的值之不同而不同。

  因这个参数是一个 Function的Address所以我们固定将Hook Function放在.Bas中,并以AddressOf HookFunc传入。至于Hook Function的名称我们可以任意给定,不一定叫HookFunc

  hmod 代表.DLL的hInstance,如果是Local Hook,该值可以是Null(VB中可传0进去),而如果是Remote Hook,则可以使用GetModuleHandle(".dll名称")来传入。

  dwThreadId 代表执行这个Hook的ThreadId,如果不设定是那个Thread来做,则传0(所以 一般来说,Remote Hook传0进去),而VB的Local Hook一般可传App.ThreadId进去。
  值回值 如果SetWindowsHookEx()成功,它会传回一个值,代表目前的Hook的Handle, 这个值要记录下来。
  因为A程序可以有一个System Hook(Remote Hook),如KeyBoard Hook,而B程序也来设一 个Remote的 KeyBoard Hook,那麽到底KeyBoard的信息谁所拦截?答案是,最後的那一个 所拦截,也就是说A先做 keyboard Hook,而後B才做,那信息被B拦截,那A呢?就看B的 Hook Function如何做。如果B想让A的 Hook Function也得这个信息,那B就得呼叫 CallNextHookEx()将这信息Pass给A,於是产生Hook的一个连线。如果B中不想Pass这信息给A,那就不要呼叫CallNextHookEx()。


Declare Function CallNextHookEx Lib "user32" Alias "CallNextHookEx" _
(ByVal hHook As Long, _
ByVal ncode As Long, _
ByVal wParam As Long, _
lParam As Any) As Long

  hHook值是SetWindowsHookEx()的传回值,nCode, wParam, lParam则是Hook Procedure 中的三个参数。
  最後是将这Hook去除掉,请呼叫UnHookWindowHookEx()
  Declare Function UnhookWindowsHookEx Lib "user32" Alias "UnhookWindowsHookEx" _
(ByVal hHook As Long) As Long
  hHook便是SetWindowsHookEx()的传回值。此时,以上例来说,B程序结束Hook,则换A可 以直接拦截信息。


用Vb让窗口总在上面
  VB实现窗口拥有“Always On Top”特性,定义全局常量及函数:
  Global Const HWND_TOPMOST=-1
  Global Const SWP_NOACTIVATE=&H10
  Global Const SWP_SHOWWINDOW=&H40
  Declare Sub SetWindowPos Lib “User”(ByBal hWnd as Integer,hWndInserAfter as Integer,
ByVal X as Integer,ByVal Y as Integer,ByVal cx as Integer,ByVal cy as Integer,ByVAL wFlags as
 Integer)
  主程序如下:
  Sub Main 0
  Screen.MousePointer=11′使鼠标变为漏斗状
  Load SystemCover’装载系统封面窗体
  SetWindowPos SystemCover.hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOACTIVATE Or SWP_SHOWWINDOW’
使得封面总处于最前面
  Load InitWindow1′装载初始化窗体1
  Load InitWindow2′装载初始化窗体2
  :
  :
  Unload SystemCover’关闭系统封面窗体
  Screen.MousePointer=0′使鼠标变为缺省形状
  End Sub

2005年04月07日

VB访问SQLServer的探讨
摘要

本文讨论了Visual Basic应用程序访问SQL Server数据的几中常用的方法,分别说明了每种方法的内部机理并给出了每种方法的一个简单的实例,最后比较了每种方法的

性能和优缺点。

引言

Microsoft Visual Basic(简称VB)作为一种面向对象的可视化编程工具,具有简单易学的,灵活方便和易于扩充的特点。而且Microsoft为其提供了与SQL Server通信的API函数集及工具集。因此它越来越多地用作大型公司数据和客户机—服务器应用程序的前端。与后端的Microsoft SQL Server相结合,VB能够提供一个鲁棒的、高性能的客户机—服务器方案。

使用Visual Basic作为前端开发语言,与SQL Server接口有三种常用的方法,即:
*数据访问对象/Jet
*为ODBC API编程
*使用SQL Server的Visual Basic库(VBSQL)为DB库API编程
本文将讨论这三种VB应用程序管理SQL Server数据的方法,并比较每种方法的性
能和优缺点。

方法1.数据访问对象/JetVisual Basic支持Data Access Objects(DAOs)的子集。DAO的方法虽然不是性能最好的管理客户机—服务器之间的对话方式,但它确有许多优点。使用DAOs访问SQL Server的过程如下:应用程序准备好语句并送至Jet,Jet引擎(MASJT200.DLL)优化查询,载入驱动程序管理器并与之通讯,驱动程序管理器(ODBC.DLL)通地调用驱动器(SQLSRVR.DLL)的函数,实现连接到数据源,翻译并向SQL Server提交SQL语句且返回结果。下面是一个用DAOs访问SQL Server的VB实例。

‘Form Declarations
Dim mydb As Database
Dim mydynaset As Dynaset
Private Sub Form_Load()
Set mydb=OpenDatabase(“”,Fa|se,Fa|se,”ODBC;DSN=Myserver;WSID=LCL;DATABASE=sa|es”)
Set mydynaset=mydb CreateDynaset(“Select*from Customers”)
End Sub

上述例子是以非独占、非只读方式打开sales数据库,并检索Customers表中的所有字段。OpenDatabase函数的最后一个参数是ODBC连接字符串参数,它指明了Microsoft Access连接到SQL Server所需要知道的一些内容。其中“DSN”为数据源名,“WSID”为工作站名,

“DATABASE”为所要访问的数据库名。

方法2.用ODBC API编程

ODBC(Open Database Connectivity)的思想是访问异种数据库的一种可移植的方式。与数据资源对话的公用函数组装在一个称为驱动程序管理器(ODBC.DLL)的动态连接中。应用程序调用驱动程序管理器中的函数,而驱动程序管理器反过来通过驱动器反过来通来驱动器(SQLSRVR.DLL)把它们送到服务器中。用ODBC API编程,一般要用到以下一些函数。下面列出了常用的函数以及它们的功能。
函数 功能
SQLALLocEnv 初始化ODBC环境,返回环境句柄
SQLALLocConnect 为连接句柄分配内存并返回连接句柄
SQLConnect 连接一个SQL数据资源
SQLDriverConnect 连接一个SQL数据资源,允许驱动器向用户询问信息
SQLALLocStmt 为语句句柄分配内存并返回语句句柄
SQLExecDirect 把SQL语句送到服务器
SQLFetchAdvances 到结果集的下一行(或第一行)
SQLGetData 从结果集的特定的一列取回数据
SQLFreeStmt 释放与语句句柄相关的资源
SQLDisconnect 切断连接
SQLFreeConnect 释放与连接句柄相关的资源
SQLFreeEnv 释放与环境句柄相关的资源
下面的代码使用上面一些函数先登录到一个服务器数据库,并为随后的工作设置了语句
句柄。
Global giHEnv As Long
Global giHDB As Long
Global giHStmt As Long
Dim myResult As integer
Dim myConnection As Srting
Dim myBuff As String*256
Dim myBufflen As Integer
If SQLA||ocEnv(giHEnv)<>SQL_SUCCESS Then
MsgBox”A||ocation couldn’t happen!”
End if
if SQL||ocConnect(giHEnv,giHDB)<>SQL_SUCCESS Then
MsgBox “SQL Server couldn’t connect!”
End if
myConnection=”DSN=myServer;UID=|c|;PWD=;APP=ODBCTest;WS|D=LCL;DATABASE=sales”
myResult=SQLDriverConnect(giHDB,Test,form1.hWnd,myConnection.len(myConnection),
myBuff,256,myBufflen,SQL_DRIVER_COMPLETE_REQUIED)
myResult=SQLA||ocStmt(giHDS,giHStmt)
myResult=SQLFreeStmt(giHStmt,SQL_COLSE)
rsSQL=”Select*from Customers Where City=”Wuhan”"
myResult=SQLExecDirect(giHStmt,rsSQL,Len(rsSQL))

方法3.使用VBSQL对DB库API编程

DB库是SQL Server的本地API,SQL Server的Visual Basic库(VBSQL)为Visual Basic程序员提供API。从一定意义上说,VBSQL是连接Visual Basic程序到SQL Server的性能最好最直接的方式。VBSQL包含以下三个文件:

VBSQL.VBX 包含库函数,具有访问重要的消息和处理错误的能力
VBSQL.BI 包括所有的常量和变量说明
VBSQL.HLP Windows帮助文件,使用VBSQL的指南
使用VBSQL时,必需将VBSQL.BI加入到Visual Basic工程文件中,并确保VB程序运行时有
VBSQL.VBX文件。
一个典型的VBSQL对话中,一般要用到以下这些函数。
函数 功能
Sqllnit 在客户机上装载DB库
SqlOpenConnection 打开服务器连接,返回连接句柄
SqlCmd 在客户机上建立批处理命令
SqlExec 向服务器提交批处理命令
Sqlrexu|ts 把客户机定位在第一条(或下一条)结果集的开端
SqlNextRow 驱动每个结果集的行之间的循环
SqlData 访问一个特定列的数据
SqlC|ose 切断特定的连接
SqlExit 切断所有找开的连接
SqlWinExit 卸下DB库
一般的DB库API编程的过程是这样的:先通过调用SqlInit对DB库进行初始化,再调用
SqlConnection打开一个连接,然后就可做一些工作。下面的代码是一个初始化DB库并
登录到服务器的通用例程。
Private Sub |nitia|izeApp|ication()
DBL|B-VERS|ON=Sq||nit()
|f DBL|B_VERS|ON=”"Then
MsgBox”Could not initia|ize DBL|B!Exit app|ication.”, MB_|CONEXCLAMAT|ON
End
End if
End Sub
Private Function LoginToServer() As integer
loginToServer=SUCCEED
Status%=Sq|SetloginTime%(loginTimeOut)
|f giSq|Conn<>0 Then
Sq|C|ose(giSq|Conn) ‘关闭已打开的连接
giSq|Conn=Sq|OpenConnection(gsServerName,gsLogin|D,gsPassword,Progr amName,ProgramName)
|f giSq|Conn<>o Then
|iresu|t=Sq|Use(giSq|Conn,”Sales”)
Else
LogintoServer=FA|L
End |f
End Function

性能比较

以上三种访问SQL Server的方法各有各的特点。DAOs方法是基于对象的,因而便于使用,但是它从Visual Basic到SQL Server的最慢的方式。ODBC API和VBSQL方法从本质上讲是基于程序的。ODBC API方法通用性好,允许最强的互操作性,编程简单,但速度慢于VBSQL方法。VBSQL方法通过VBSQL控件,提供了重要的SQL` Server前端应用程序所需的灵活性、强大功能和良好性能。它具有真正的事件驱动及错误处理能力,完全支持异步处理、游标和计算列等。这些都是VBSQL方法超出其它方法的优势,但其编程稍复杂。至于实际使用哪一种接口方式,在很大程度上依赖于用户的应用程序的具体情况而定。

2005年01月04日

专栏作品
VB6 中将数据导出到 Excel 提速之法
李洪根
——————————————————————————–

Excel 是一个非常优秀的报表制作软件,用VBA可以控制其生成优秀的报表,本文通过添加查询语句的方法,即用Excel中的获取外部数据的功能将数据很快地从一个查询语句中捕获到EXCEL中,比起往每个CELL里写数据的方法提高许多倍。
在程序中引用Microsoft Excel 9.0 Object Library,将下文加入到一个模块中,窗体中调用如下ExporToExcel(“select * from table”)。则实现快速将数据导出到EXCEL中。

Public Function ExporToExcel(strOpen As String)
‘*********************************************************
‘* 名称:ExporToExcel
‘* 功能:导出数据到EXCEL
‘* 用法:ExporToExcel(sql查询字符串)
‘*********************************************************
Dim Rs_Data As New ADODB.Recordset
Dim Irowcount As Integer
Dim Icolcount As Integer
   
    Dim xlApp As New Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    Dim xlQuery As Excel.QueryTable
   
    With Rs_Data
        If .State = adStateOpen Then
            .Close
        End If
        .ActiveConnection = Cn
        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockReadOnly
        .Source = strOpen
        .Open
    End With
    With Rs_Data
        If .RecordCount < 1 Then
            MsgBox (“没有记录!”)
            Exit Function
        End If
        ‘记录总数
        Irowcount = .RecordCount
        ‘字段总数
        Icolcount = .Fields.Count
    End With
   
    Set xlApp = CreateObject(“Excel.Application”)
    Set xlBook = Nothing
    Set xlSheet = Nothing
    Set xlBook = xlApp.Workbooks().Add
    Set xlSheet = xlBook.Worksheets(“sheet1″)
    xlApp.Visible = True
   
    ‘添加查询语句,导入EXCEL数据
    Set xlQuery = xlSheet.QueryTables.Add(Rs_Data, xlSheet.Range(“a1″))
   
    With xlQuery
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = True
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
    End With
   
    xlQuery.FieldNames = True ‘显示字段名
    xlQuery.Refresh
   
    With xlSheet
        .Range(.Cells(1, 1), .Cells(1, Icolcount)).Font.Name = “黑体”
        ‘设标题为黑体字
        .Range(.Cells(1, 1), .Cells(1, Icolcount)).Font.Bold = True
        ‘标题字体加粗
        .Range(.Cells(1, 1), .Cells(Irowcount + 1, Icolcount)).Borders.LineStyle = xlContinuous
        ‘设表格边框样式
    End With
   
    With xlSheet.PageSetup
        .LeftHeader = “” & Chr(10) & “&”"楷体_GB2312,常规”"&10公司名称:”   ‘ & Gsmc
        .CenterHeader = “&”"楷体_GB2312,常规”"公司人员情况表&”"宋体,常规”"” & Chr(10) & “&”"楷体_GB2312,常规”"&10日 期:”
        .RightHeader = “” & Chr(10) & “&”"楷体_GB2312,常规”"&10单位:”
        .LeftFooter = “&”"楷体_GB2312,常规”"&10制表人:”
        .CenterFooter = “&”"楷体_GB2312,常规”"&10制表日期:”
        .RightFooter = “&”"楷体_GB2312,常规”"&10第&P页 共&N页”
    End With
   
    xlApp.Application.Visible = True
    Set xlApp = Nothing  ‘”交还控制给Excel
    Set xlBook = Nothing
    Set xlSheet = Nothing
End Function

注::在程序中引用’Microsoft Excel 9.0 Object Library’和ADO对象,机器必装Excel 2000
本程序在Windows 98/2000,VB 6 下运行通过。

2004年12月20日

INI文件应该使用GetPrivateProfileString,该函数定义如下:
    Declare Function GetPrivateProfileString Lib _
     “kernel32″ Alias “GetPrivateProfileStringA” ( _
     ByVal lpApplicationName As Any, ByVal lpKeyName As Any, _
     ByVal lpDefault As String, ByVal lpReturnedString As String, _
     ByVal nSize As Long, ByVal lpFileName As String) As Long
    请注意这里我们定义前两个参数为Any类型。按照API说明,如果lpApplicationName参数为NULL,则该函数返回所有的段,如:
     Dim s As String
     s = Space(256)
     GetPrivateProfileString 0&, 0&, “”, s, 256, “control.ini”
     Dim v As Variant
     v = Split(s, Chr(0))
     Dim i
     For i = 0 To UBound(v)
     List1.AddItem v(i)
     Next
    这里的Split是VB6的新函数,VB5的用户可以使用:
     Public Function Split(ByVal sIn As String, Optional sDelim As _
     String, Optional nLimit As Long = -1, Optional bCompare As _
     VbCompareMethod = vbBinaryCompare) As Variant
     Dim sRead As String, sOut() As String, nC As Integer
     If sDelim = “” Then
     Split = sIn
     End If
     sRead = ReadUntil(sIn, sDelim, bCompare)
     Do
     ReDim Preserve sOut(nC)
     sOut(nC) = sRead
     nC = nC + 1
     If nLimit <> -1 And nC >= nLimit Then Exit Do
     sRead = ReadUntil(sIn, sDelim)
     Loop While sRead <> “”
     ReDim Preserve sOut(nC)
     sOut(nC) = sIn
     Split = sOut
     End Function
    
     Public Function ReadUntil(ByRef sIn As String, _
     sDelim As String, Optional bCompare As VbCompareMethod _
     = vbBinaryCompare) As String
     Dim nPos As String
     nPos = InStr(1, sIn, sDelim, bCompare)
     If nPos > 0 Then
     ReadUntil = Left(sIn, nPos – 1)
     sIn = Mid(sIn, nPos + Len(sDelim))
     End If
     End Function
    而如果第一个参数不为NULL,第二个参数为NULL,则返回段中所有项的名字,如
     Dim s As String
     s = Space(256)
     GetPrivateProfileString “don’t load”, 0&, “”, s, 256, “control.ini”
     Dim v As Variant
     v = Split(s, Chr(0))
     Dim i
     For i = 0 To UBound(v)
     List1.AddItem v(i)
     Next

2004年12月19日

递归
递归算法

程序调用自身的编程技巧称为递归(recursion)。

一个比较经典的描述是老和尚讲故事,他说从前有座山,山上有座庙,庙里有个老和尚在讲故事,他说从前有座山,山上有座庙,庙里有个老和尚在讲故事,他说从前有座山,……。这样没完没了地反复讲故事,直到最后老和尚烦了停下来为止。

反复讲故事可以看成是反复调用自身,但如果不能停下来那就没有意义了,所以最终还要能停下来。递归的关键在于找出递归方程式和递归终止条件。即老和尚反复讲故事这样的递归方程式要有,最后老和尚烦了停下来这样的递归的终止条件也要有。

阶乘的算法可以定义成函数

         n*f(n-1)  (n>0)

f(n)=

         f(n)=1   (n=0)

当n>0时,用f(n-1)来定义f(n),用f(n-1-1)来定义f(n-1)……,这是对递归形式的描述。

当n=0时,f(n)=1,这是递归结束的条件。

递归算法一般用于解决三类问题:

⑴. 数据的定义形式是按递归定义的。

比如阶乘的定义。      

例1 又如裴波那契数列的定义:f(n)=f(n-1)+f(n-2); f(0)=1; f(1)=2

对应的递归程序为:

var n:integer;

function f(n:integer):longint;

begin

     case n of

        0:f:=1;  {递归结束条件}

        1:f:=2;

      else

        f:=f(n-1)+f(n-2)  {递归调用}

     end

end;

begin

     readln(n);

     writeln(f(n))

end.

这类递归问题往往又可转化成递推算法,递归边界作为递推的边界条件。

⑵. 问题解法按递归算法实现。例如回溯等。

⑶. 数据的结构形式是按递归定义的。如树的遍历, 图的搜索等。

递归解决实际问题的例子很多,如经典的梵塔问题。

例2 梵塔问题:有n个半径各不相同的圆盘,按半径从大到小,自下而上依次套在A柱上,另外还有B、C两根空柱。要求将A柱上的n个圆盘全部搬到C柱上去,每次只能搬动一个盘子,且必须始终保持每根柱子上是小盘在上,大盘在下。

在移动盘子的过程当中发现要搬动n个盘子,必须先将n-1个盘子从A柱搬到B柱去,再将A柱上的最后一个盘子搬到C柱,最后从B柱上将n-1个盘子搬到C柱去。搬动n个盘子和搬动n-1个盘子时的方法是一样的,当盘子搬到只剩一个时,递归结束。

程序如下:

var a,b,c,number:integer;

procedure move(n,a,b,c:integer);

begin

     if n=1 then writeln(a,’->’,c)

     else

         begin

              move(n-1,a,c,b);

              writeln(a,’->’,c);

              move(n-1,b,a,c)

         end;

end;

begin

     write(‘the number of dish:’);

     readln(number);

     move(number,1,2,3);

     readln

end.

自然数的拆分,数字的拆分等都可以用到递归算法。

例3 要求找出具有下列性质的数的个数(包含输入的自然数n):

先输入一个自然数n(n<=500),然后对此自然数按照如下方法进行处理:

①. 不作任何处理;

②. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;

③. 加上数后,继续按此规则进行处理,直到不能再加自然数为止.

样例:  输入:  6

满足条件的数为   6

                16

                26

               126

                36

               136

输出:  6

这道题只需求出满足条件的数的个数,在n值不大的情况下用递归求解比较方便,因为它本身题目的条件就是递归定义的。

递归的样例程序如下:

var n,i:integer;

    s:real;

procedure qiu(x:integer);

var k:integer;

begin

     if x<>0 then

     begin

          s:=s+1;

          for k:=1 to x div 2 do qiu(k)

     end

end;

begin

     readln(n);

     s:=0;

     qiu(n);

     writeln(s:2:0)

end.

递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
 

2004年12月17日

 
 http://www.vccode.com
http://www.vckbase.com
http://soft.yesky.com/SoftChannel/72342371928375296/index.shtml
http://www.csdn.net/develop/
http://www.comprg.com.cn/titl_jpwz1.htm
http://www.pconline.com.cn/pcedu/empolder/gj/vc/index.html
http://www.programfan.net/article.asp
http://www.czvc.com/index.asp
http://www.vczx.com
http://www.vchome.net/tech/alltech.htm
英文
http://www.codeguru.com/index.shtml
http://www.codeproject.com/http://www.codetools.com/
http://www.devx.com/cplus/
http://www.cplusplus.com
 

TCP/IP是很多的不同的协议组成,实际上是一个协议组,TCP用户数据报表协议(也称作TCP传输控制协议,Transport Control Protocol。可靠的主机到主机层协议。这里要先强调一下,传输控制协议是OSI网络的第四层的叫法,TCP传输控制协议是TCP/IP传输的6个基本协议的一种。两个TCP意思非相同。 )。TCP是一种可靠的面向连接的传送服务。它在传送数据时是分段进行的,主机交换数据必须建立一个会话。它用比特流通信,即数据被作为无结构的字节流。 通过每个TCP传输的字段指定顺序号,以获得可靠性。是在OSI参考模型中的第四层,TCP是使用IP的网间互联功能而提供可靠的数据传输,IP不停的把报文放到 网络上,而TCP是负责确信报文到达。在协同IP的操作中TCP负责:握手过程、报文管理、流量控制、错误检测和处理(控制),可以根据一定的编号顺序对非正常顺序的报文给予从新排列顺序。关于TCP的RFC文档有RFC793、RFC791、RFC1700。

在TCP会话初期,有所谓的“三握手”:对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。由于TCP需要时刻跟踪,这需要额外开销,使得TCP的格式有些显得复杂。下面就让我们看一个TCP的经典案例,这是后来被称为MITNICK攻击中KEVIN开创了两种攻击技术:

TCP会话劫持
SYN FLOOD(同步洪流)

在这里我们讨论的时TCP会话劫持的问题。

先让我们明白TCP建立连接的基本简单的过程。为了建设一个小型的模仿环境我们假设有3台接入互联网的机器。A为攻击者操纵的攻击机。B为中介跳板机器(受信任的服务器)。C为受害者使用的机器(多是服务器),这里把C机器锁定为目标机器。A机器向B机器发送SYN包,请求建立连接,这时已经响应请求的B机器会向A机器回应SYN/ACK表明同意建立连接,当A机器接受到B机器发送的SYN/ACK回应时,发送应答ACK建立A机器与B机器的网络连接。这样一个两台机器之间的TCP通话信道就建立成功了。

B终端受信任的服务器向C机器发起TCP连接,A机器对服务器发起SYN信息,使C机器不能响应B机器。在同时A机器也向B机器发送虚假的C机器回应的SYN数据包,接收到SYN数据包的B机器(被C机器信任)开始发送应答连接建立的SYN/ACK数据包,这时C机器正在忙于响应以前发送的SYN数据而无暇回应B机器,而A机器的攻击者预测出B机器包的序列号(现在的TCP序列号预测难度有所加大)假冒C机器向B机器发送应答ACK这时攻击者骗取B机器的信任,假冒C机器与B机器建立起TCP协议的对话连接。这个时候的C机器还是在响应攻击者A机器发送的SYN数据。

TCP协议栈的弱点:TCP连接的资源消耗,其中包括:数据包信息、条件状态、序列号等。通过故意不完成建立连接所需要的三次握手过程,造成连接一方的资源耗尽。

通过攻击者有意的不完成建立连接所需要的三次握手的全过程,从而造成了C机器的资源耗尽。序列号的可预测性,目标主机应答连接请求时返回的SYN/ACK的序列号时可预测的。(早期TCP协议栈,具体的可以参见1981年出的关于TCP雏形的RFC793文档)


TCP头结构

TCP协议头最少20个字节,包括以下的区域(由于翻译不禁相同,文章中给出相应的英文单词):

TCP源端口(Source Port):16位的源端口其中包含初始化通信的端口。源端口和源IP地址的作用是标示报问的返回地址。

TCP目的端口(Destination port):16位的目的端口域定义传输的目的。这个端口指明报文接收计算机上的应用程序地址接口。

TCP序列号(序列码,Sequence Number):32位的序列号由接收端计算机使用,重新分段的报文成最初形式。当SYN出现,序列码实际上是初始序列码(ISN),而第一个数据字节是ISN+1。这个序列号(序列码)是可以补偿传输中的 不一致。

TCP应答号(Acknowledgment Number):32位的序列号由接收端计算机使用,重组分段的报文成最初形式。,如果设置了ACK控制位,这个值表示一个准备接收的包的序列码。

数据偏移量(HLEN):4位包括TCP头大小,指示何处数据开始。

保留(Reserved):6位值域,这些位必须是0。为了将来定义新的用途所保留。

标志(Code Bits):6位标志域。表示为:紧急标志、有意义的应答标志、推、重置连接标志、同步序列号标志、完成发送数据标志。按照顺序排列是:URG、ACK、PSH、RST、SYN、FIN。

窗口(Window):16位,用来表示想收到的每个TCP数据段的大小。

校验位(Checksum):16位TCP头。源机器基于数据内容计算一个数值,收信息机要与源机器数值 结果完全一样,从而证明数据的有效性。

优先指针(紧急,Urgent Pointer):16位,指向后面是优先数据的字节,在URG标志设置了时才有效。如果URG标志没有被设置,紧急域作为填充。加快处理标示为紧急的数据段。

选项(Option):长度不定,但长度必须以字节。如果 没有 选项就表示这个一字节的域等于0。

填充:不定长,填充的内容必须为0,它是为了数学目的而存在。目的是确保空间的可预测性。保证包头的结合和数据的开始处偏移量能够被32整除,一般额外的零以保证TCP头是32位的整数倍。


标志控制功能

URG:紧急标志
紧急(The urgent pointer) 标志有效。紧急标志置位,

ACK:确认标志
确认编号(Acknowledgement Number)栏有效。大多数情况下该标志位是置位的。TCP报头内的确认编号栏内包含的确认编号(w+1,Figure:1)为下一个预期的序列编号,同时提示远端系统已经成功接收所有数据。

  PSH:推标志
该标志置位时,接收端不将该数据进行队列处理,而是尽可能快将数据转由应用处理。在处理 telnet 或 rlogin 等交互模式的连接时,该标志总是置位的。

RST:复位标志
  复位标志有效。用于复位相应的TCP连接。

SYN:同步标志
同步序列编号(Synchronize Sequence Numbers)栏有效。该标志仅在三次握手建立TCP连接时有效。它提示TCP连接的服务端检查序列编号,该序列编号为TCP连接初始端(一般是客户端)的初始序列编号。在这里,可以把TCP序列编号看作是一个范围从0到4,294,967,295的32位计数器。通过TCP连接交换的数据中每一个字节都经过序列编号。在TCP报头中的序列编号栏包括了TCP分段中第一个字节的序列编号。

  FIN:结束标志
  带有该标志置位的数据包用来结束一个TCP回话,但对应端口仍处于开放状态,准备接收后续数据。

服务端处于监听状态,客户端用于建立连接请求的数据包(IP packet)按照TCP/IP协议堆栈组合成为TCP处理的分段(segment)。

  
分析报头信息: TCP层接收到相应的TCP和IP报头,将这些信息存储到内存中。

  检查TCP校验和(checksum):标准的校验和位于分段之中(Figure:2)。如果检验失败,不返回确认,该分段丢弃,并等待客户端进行重传。

  查找协议控制块(PCB{}):TCP查找与该连接相关联的协议控制块。如果没有找到,TCP将该分段丢弃并返回RST。(这就是TCP处理没有端口监听情况下的机制) 如果该协议控制块存在,但状态为关闭,服务端不调用connect()或listen()。该分段丢弃,但不返回RST。客户端会尝试重新建立连接请求。

  建立新的socket:当处于监听状态的socket收到该分段时,会建立一个子socket,同时还有socket{},tcpcb{}和pub{}建立。这时如果有错误发生,会通过标志位来拆除相应的socket和释放内存,TCP连接失败。如果缓存队列处于填满状态,TCP认为有错误发生,所有的后续连接请求会被拒绝。这里可以看出SYN Flood攻击是如何起作用的。

  丢弃:如果该分段中的标志为RST或ACK,或者没有SYN标志,则该分段丢弃。并释放相应的内存。


发送序列变量

SND.UNA : 发送未确认

SND.NXT : 发送下一个

SND.WND : 发送窗口

SND.UP : 发送优先指针

SND.WL1 : 用于最后窗口更新的段序列号

SND.WL2 : 用于最后窗口更新的段确认号

ISS : 初始发送序列号

 


接收序列号

RCV.NXT : 接收下一个

RCV.WND : 接收下一个

RCV.UP : 接收优先指针

IRS : 初始接收序列号


当前段变量

SEG.SEQ : 段序列号

SEG.ACK : 段确认标记

SEG.LEN : 段长

SEG.WND : 段窗口

SEG.UP : 段紧急指针

SEG.PRC : 段优先级


CLOSED表示没有连接,各个状态的意义如下:

LISTEN : 监听来自远方TCP端口的连接请求。

SYN-SENT : 在发送连接请求后等待匹配的连接请求。

SYN-RECEIVED : 在收到和发送一个连接请求后等待对连接请求的确认。

ESTABLISHED : 代表一个打开的连接,数据可以传送给用户。

FIN-WAIT-1 : 等待远程TCP的连接中断请求,或先前的连接中断请求的确认。

FIN-WAIT-2 : 从远程TCP等待连接中断请求。

CLOSE-WAIT : 等待从本地用户发来的连接中断请求。

CLOSING : 等待远程TCP对连接中断的确认。

LAST-ACK : 等待原来发向远程TCP的连接中断请求的确认。

TIME-WAIT : 等待足够的时间以确保远程TCP接收到连接中断请求的确认。

CLOSED : 没有任何连接状态。

TCP连接过程是状态的转换,促使发生状态转换的是用户调用:OPEN,SEND,RECEIVE,CLOSE,ABORT和STATUS。传送过来的数据段,特别那些包括以下标记的数据段SYN,ACK,RST和FIN。还有超时,上面所说的都会时TCP状态发生变化。


序列号

请注意,我们在TCP连接中发送的字节都有一个序列号。因为编了号,所以可以确认它们的收到。对序列号的确认是累积性的。TCP必须进行的序列号比较操作种类包括以下几种:

①决定一些发送了的但未确认的序列号。

②决定所有的序列号都已经收到了。

③决定下一个段中应该包括的序列号。


对于发送的数据TCP要接收确认,确认时必须进行的:

SND.UNA = 最老的确认了的序列号。

SND.NXT = 下一个要发送的序列号。

SEG.ACK = 接收TCP的确认,接收TCP期待的下一个序列号。

SEG.SEQ = 一个数据段的第一个序列号。

SEG.LEN = 数据段中包括的字节数。

SEG.SEQ+SEG.LEN-1 = 数据段的最后一个序列号。

如果一个数据段的序列号小于等于确认号的值,那么整个数据段就被确认了。而在接收数据时下面的比较操作是必须的:

RCV.NXT = 期待的序列号和接收窗口的最低沿。

RCV.NXT+RCV.WND:1 = 最后一个序列号和接收窗口的最高沿。

SEG.SEQ = 接收到的第一个序列号。

SEG.SEQ+SEG.LEN:1 = 接收到的最后一个序列号

T-SQL是SQL Server的语言引擎,而Oracle的语言引擎却是PLSQL。这两种查询语言都对ANSI SQL-92标准进行了扩展以提供额外的支持力度。你所创建的应用程序几乎都要用到这些补充特性。本文就对最常用的、非标准的Oracle扩展进行了说明,同时还要介绍下如何对这些扩展进行转化以用在SQL Server环境下。

列的选择
  
用PLSQL执行数据查询的时候,FROM子句是必须的,这同SQL Server的要求是一样的。 SELECT语句必须选择针对的数据表。在Oracle数据库内有一种特殊的表Dual。Dual表是Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select中。Dual表由Oracle连同数据字典一同创建,所有的用户都可以用名称DUAL访问该表。这个表里只有一列DUMMY,该列定义为VARCHAR2(1)类型,有一行值X。从DUAL表选择数据常被用来通过SELECT语句计算常数表达式,由于DUAL只有一行数据,所以常数只返回一次。

Oracle下的DUAL查询如下所示:
SELECT  ‘x’ FROM dual
而对等的SQL Server查询则是下面这个样子:
SELECT ‘x’ 

以下是null相关的知识,用到了dual:
SQL> select 1 from dual where null=null;
没有查到记录
SQL> select 1 from dual where null=”;
没有查到记录
SQL> select 1 from dual where ”=”;
没有查到记录
SQL> select 1 from dual where null is null;
        1
———
        1
SQL> select 1 from dual where nvl(null,0)=nvl(null,0);
        1
———
        1
查看当前连接用户
SQL> select user from dual;

查看当前日期、时间
SQL> select sysdate from dual;

连接

Oracle用|| 符号作为连接符,而SQL Server的连接符是加号:+ 。

Oracle查询如下所示:
Select ‘Name’ || ‘Last Name’ From tableName

对应的SQL Server查询如下所示:
Select ‘Name’ + ‘Last Name’


数字取舍

Oracle数据库内有一个TRUNC函数,该函数返回m位十进制数的n位;如果省略m则n就是0位。m的值可以为负,表示截去小数点左边m位数字。

在SQL Server下可以用Round或者Floor。

以下是Oracle查询:
SELECT  TRUNC(15.79,1) “Truncate” FROM DUAL;

下面是同类查询的SQL Server版本:
SELECT ROUND(15.79, 0) rounded , ROUND(15.79, 0,1) truncated
SELECT FLOOR(ROUND(15.79, 0)), FLOOR(ROUND(15.79, 0,1) )


数字转换

Oracle的TO_CHAR函数可以把n位NUMBER数据类型转换为VARCHAR2 数据类型,同时采用可选的数字格式。

SQL Server则通过STR函数返回数字转换之后的字符数据。不过,该函数不具方便的Format参数。

Oracle查询如下:
SELECT to_char(123.45 ,99999999999999) from tab
SELECT to_char(EXPIRY_DATE,’DDMONYYYY’) from tab

以下是SQL Server版本的查询:
SELECT STR(123.45, 14)
SELECT STR(round(123.455 , 2),12,2)
SELECT CAST(REPLACE((CONVERT(varchar(12) , EXPIRYDATE, 106 )),’ ‘ , ”) as varchar(9))


LENGTH和LEN

以下是Oracle的查询:
SELECT LENGTH(‘SQLMAG’) “Length in characters” FROM DUAL;

以上查询在SQL Server下是这样写的:
SELECT LEN(‘SQLMAG’) “Length in characters”


日期

以上两种系统都具有各自的当前日期和时间格式。

Oracle取得日期和采用如下方式:
SYSDATE

SQL Server则是这样的:
GETDATE()

你可以用各种语法操作日期。以下的代码对Oracle日期值中的月份进行了格式调整(返回日期再加上n月):
Select   add_months(sysdate,12) from dual

SQL Server则是如下完成同等功能的:
Select dateadd(mm,12,getdate())

数据的减法也不同。以下代码在Oracle中直接对数据进行减法操作:
SELECT sysdate -add_months(sysdate,12) FROM dual

SQL Server则是这样做的:
SELECT  datediff(dd, GetDate(),dateadd(mm,12,getdate()))
 
参考:
BUILDER.COM

2004年12月15日

成功是每一个人都梦想,可成功不是从天上掉下来的,而是通过不断的修炼、积累而获得,只要努力提高“十商”智慧和能力,追求全面、均衡发展, 您也一定能够构建成功而幸福的大厦。 
 
  1. 德商(MQ)


  德商(Moral Intelligence Quotient,縮写成MQ),是指一个人的德性水平或道德人格品质。德商的内容包括体贴、尊重、容忍、宽恕、诚实、负责、平和、忠心、礼貌、幽默等各种美德。我们常说的“德智体”中是把德放在首位的;科尔斯说,品格胜于知识。可见,德是最重要的。一个有高德商的人,一定会受到信任和尊敬,自然会有更多成功的机会。
  古人云:“得道多助,失道寡助”、“道之以德,德者得也”,就是告诉我们要以道德来规范自己的行为,不断修炼自己,才能获得人生的成功。古今中外,一切真正的成功者,在道德上 大都达到了很高的水平。
  现实中的大量事实说明,很多人的失败,不是能力的失败,而是做人的失败、道德的失败。


  2. 智商(IQ)


  智商(Intelligence Quotient,縮写成IQ)是一种表示人的智力高低的数量指标,但也可以表现为一个人对知识的掌握程度,反映人的观察力、记忆力、思维力、想像力、创造力以及分析问题和解决问题的能力。确实,智商不是固定不变的,通过学习和训练是可以开发增长的。我们要走向成功,就必须不断学习,积累智商。
  我们不仅要从书本、从社会学习,还要从我们的上司那里学习。因为你的上司今天能有资格当你的上司,肯定有比你厉害的地方,有很多地方值得你去学习。很多人都想超越他的上司,这是非常可贵的精神,但要超越你的老板,你不学习他成功的地方,何谈超越?不断地学习,提高智商,这是成功的基本条件。


  3. 情商(EQ)


  情商(Emotional Intelligence Quotient,简写成EQ),就是管理自己的情绪和处理人际关系的能力。如今,人们面对的是快节奏的生活,高负荷的工作和复杂的人际关系,没有较高的EQ是难以获得成功的。EQ高的人,人们都喜欢同他交往,总是能得到众多人的拥护和支持。同时,人际关系也是 人生重要资源,良好的人际关系往往能获得更多的成功机会。权变理论代表人物之一弗雷德·卢森斯(Fred Luthans)对成功的管理者(晋升速度快)与有效的管理者(管理绩效高)做过调查,发现两者显著不同之处在于:维护人际网络关系对成功的管理者贡献最大,占48%,而对有效的管理者只占11%。可见,在职场中,要获得较快的成长, 仅仅埋头工作是不够的,良好的人际关系是获得成功的重要因素。


  4. 逆商(AQ)


  逆商(Adversity Intelligence Quotient,简写成AQ),是指面对逆境承受压力的能力,或承受失败和挫折的能力。当今和平年代,应付逆境的能力更能使你立于不败之地。“苦难对于天才是一块垫脚石,对于能干的人是一笔财富,而对于弱者则是一个万丈深渊。”“苦难是人生最好的教育。”名人之谈告诉我们:伟大的人格只有经历熔炼和磨难,潜力才会激发,视野才会开阔,灵魂才会升华,才会走向成功 ,正所谓吃得苦中苦,方为人上人。
  任何国家和地区的富豪,约八成出身贫寒或学历较低,他们白手起家创大业,赢得了令人羡慕的财富和名誉。他们没有一个是一帆风顺, 甚至大起大落,几经沉浮,不经失败和挫折就获得成功的。
  逆境不会长久,强者必然胜利。因为人有着惊人的潜力,只要立志发挥它,就一定能渡过难关,成就生命的辉煌。


  5. 胆商(DQ)


  胆商(Daring Intelligence Quotient,縮写成DQ)是一个人胆量、胆识、胆略的度量,体现了一种冒险精神。胆商高的人能够把握机会,该出手时就出手。无论是什么时代,没有敢于承担风险的胆略,任何时候都成不了气候。而大凡成功的商人 、政客,都是具有非凡胆略和魄力的。


  6. 财商(FQ)


  财商(Financial Intelligence Quotient,简写成FQ),是指理财能力,特别是投资收益能力。没有理财的本领,你有多少钱也会慢慢花光的,所谓“富不过三代”就是指有财商的老子辛辛苦苦积攒下来的钱,最多最后也会败在无财商的子孙手中。财商是一个人最需要的能力,也是最被人们忽略的能力。
  我们的父辈都是“穷爸爸”,只教我们好好读书,找好工作,多存钱,少花钱。赚得少一点没关系,关键是稳定。他们从没教过我要有财商,要考虑怎么理财。所以,财商对我们来说是迫切需要培养的一种能力。会理财的人越来越富有,一个关键的原因就是财商区别。特别是富人,何以能在一生中积累如此巨大的财富?答案是:投资理财的能力。


  7. 心商(MQ)


  心商(Mental Intelligence Quotient,简写成MQ),就是维持心理健康,调试心理压力,保持良好心理状况和活力的能力。21世纪是“抑郁时代”,人类面临 更大的心理压力,提高心商,保持心理健康已成为时代的迫切需要。现代人渴望成功,而成功越来越取决于一个人的心理状态,取决于一个人的心理健康。从某种意义上来讲,心商的高低,直接决定了人生过程的苦乐,主宰人生命运的成败。
  世上有很多人,取得了很大的成功,可因承受着生活的各种压力,郁郁寡欢,因不堪重压或经不起生命的一次挫折患上心理障碍,甚至走上不归路,演绎一幕幕人间悲剧。


  8. 志商(WQ)


  “志商”就是意志智商(Will Intelligence Quotient,简写成WQ ),指一个人的意志品质水平,包括坚韧性、目的性、果断性、自制力等方面。如能为学习和工作具有不怕苦和累的顽强拼搏精神,就是高志商。
  “志不强者智不达,言不信者行不果”、“勤能补拙是良训,一分辛劳一分才”。它们说明一个道理:志商对一个人的智慧具有重要的影响。人生是小志小成,大志大成。许多人一生平淡,不是因为没有才干,而是缺乏志向和清晰的发展目标。在商界尤其如此,要成就出色的事业,就得要有远大的志向。


  9. 灵商(SQ)


  灵商(Spiritual Intelligence Quotient,简写成SQ),就是对事物本质的灵感、顿悟能力和直觉思维能力。量子力学之父普朗克认为,富有创造性的科学家必须具有鲜明的直觉想像力。无论是阿基米德从洗澡中获得灵感最终发现了浮力定律,牛顿从掉下的苹果中得到启发发现了万有引力定律,还是凯库勒关于蛇首尾相连的梦而导致苯环结构的发现,都是科学史上灵商飞跃的不朽例证。
  成功人生没有定式,单靠成文的理论是解决不了实际问题的,还得需要悟性,需要灵商的闪现。修炼灵商,关键在于不断学习、观察、思考,要敢于大胆的假设,敢于突破传统思维。


  10.健商(HQ)


  健商(Health Intelligence Quotient,简写成HQ)是指个人所具有的健康意识、健康知识和健康能力的反映。健康是人生最大的财富,就好象健康是1,事业、爱情、金钱、家庭、友谊、权力等等是1后面的零,所以光有1的人生是远远不够的,但是失去了1(健康),后面的0再多对你也没有任何意义,正所谓平安是福。所以幸福的前提是关爱、珍惜自己生命,并努力地去创造、分享事业、爱情、财富、权力等等人生价值。

2004年12月14日

Your Key to a Happy and Better Life
By Remez Sasson
 
When we feel down and worried, we often hear people telling us: “Think positive!”. Most people do not take these words seriously, as they do not know what the power of positive thinking really is, or do not consider it as useful and effective. How many people do you know that ever stop to think what the power of positive thinking means? 
 
Many do not believe that it works, considering it as just nonsense, and scoff at people who do. Among the people who are conversant with this subject, not many know how to use it effectively in order to get results. Yet, it seems that more people are becoming attracted to this subject, as evidenced by the many books, lectures and courses about it. This is a subject that is gaining popularity.
 
Thinking positively means admitting into the mind only thoughts, words and images that are conductive to growth, expansion and success. It is the expectation of good and favorable results. A positive mind anticipates happiness, joy, health and a successful outcome of every situation and action. Whatever the mind expects, it finds. 
 
Allan applied for a new job, but as his self-esteem was low, and he considered himself as a failure and unworthy of success, he was sure that he was not going to get the job. He had a negative attitude towards himself, and believed that the other applicants were better and more qualified than him. Allan manifested this attitude because he was not admitted to most of the jobs he applied to, and consequently had negative past experience.
 
His mind was filled with negative thoughts and fears concerning the job for the whole week before the job interview. He was sure he would be rejected. On the day of the interview he got up late, and to his horror he discovered that the shirt he had planned to wear was dirty, and the other one needed ironing. As it was already too late, he went out with a wrinkled shirt.
 
During the interview he was tense, displayed a negative attitude, worried about his shirt, and felt hungry because he did not have enough time to eat breakfast. All this distracted his mind and made it difficult for him to focus on the interview. His overall behavior made a bad impression, and consequently he materialized his fear and did not get the job.
 
Jim applied for the same job too, but approached the matter in a different way. He was sure that he was going to get the job. During the week preceding the interview he often visualized himself making a good impression and getting the job.
 
In the evening before the interview he prepared the clothes he was going to wear, and went to sleep a little earlier. On day of the interview he woke up earlier than usual, and had ample time to eat breakfast, and then to arrive to the interview before the scheduled time. 
 
He got the job because he made a good impression. Of course he had also the proper qualifications for the job, but so had Allan.
 
What do we learn from these two stories? Is there any magic employed here? No, it is all natural. When the attitude is positive we entertain pleasant feelings and constructive images, and see in our mind’s eye what we really want to happen. This brings brightness to the eyes, more energy and happiness. The whole being broadcasts good will, happiness and success. Even the health is affected in a beneficial way. We walk tall and the voice is more powerful. Our body language shows the way you feel inside.
 
All of us affect, whether positively or negatively, the people we meet. This happens instinctively and on a subconscious level, through thoughts and feelings transference, or through body language.  People sense our aura and are affected by our thoughts. Is it any wonder that we want to be around positive persons and shun negative ones? People are more disposed to help us if we are positive. They dislike and avoid anyone broadcasting negativity. 
 
Negative thoughts, words and attitude bring up negative and unhappy moods and actions. When the mind is negative, poisons are released into the blood, which cause more unhappiness and negativity. Negative thinking is the way to failure, frustration and disappointment.
 
Positive and negative thinking are both contagious, and their results are very obvious. If you choose the former you gain a great and beneficial power. In order to turn the mind towards the positive, knowledge and training are necessary. People do not change their attitude and thoughts overnight.
 
Read about this subject. Meditate about its benefits, and persuade your mind to try it. The power of thoughts is a mighty power that is always shaping our lives. This shaping is usually done subconsciously, but it is possible to make the process a conscious one. Even if the idea seems strange, give it a try, as you have nothing to lose, but only to gain. Forget what others might say or think about you if you change the way you think.
 
Always visualize only favorable and beneficial situations. Use positive words in your inner dialogues or when talking with others. Smile a little more, as this helps to think positively. If you feel inner resistance when replacing negative thoughts with positive ones, do not give up, but keep looking only at the beneficial, good and happy thoughts in your mind. Disregard any feelings of laziness or a desire to quit. If you persevere, you will transform the way your mind thinks.
 
Once a negative thought enters your mind, you have to be aware of it and endeavor to replace it with a constructive one. The negative thought will try again to enter your mind, and then you have to replace it again with a positive one. It is as if there are two pictures in front of you, and you choose to look at one and disregard the other. Persistence will eventually teach your mind to think positively and ignore negative thoughts.
 
It does not matter what your circumstances are at the present moment. Think positively, expect only favorable results and situations, and circumstances will change accordingly. It may take some time for the changes to take place, but eventually they do.
 
Another method to employ is the repetition of affirmations. It is a method which resembles creative visualization, and which can be used in conjunction with it. It is the subject of another article on this website.
 
The other articles at this website, about the power of concentration, will power, self-discipline and peace of mind also contribute to the development of a positive mind, and are recommended for reading and practicing.