📄 网络和通讯编程.htm
字号:
<html><head><style type="text/css"><!--.p9 { font-family: "宋体"; font-size: 9pt}a {text-transform: none; text-decoration: none;}a:hover {text-decoration: underline; color: #FF0000;}--></style><title></title></head><body background="di2001.jpg"><h3 align="center"><font COLOR="#AOAO99">网络和通讯编程</font></h3><table width="100%"> <tr> <td><font color="0000FF"><a name="1">打开拨号连接</a></font></td> </tr> <tr> <td> 调用拨号网络里的拨号程序来连接:其中'连接Internet'为你创建的拨号程序名称<br> winexec('rundll32.exe rnaui.dll,RnaDial '+'连接Internet',9);<br> </td> </tr> <tr> <td><font color="0000FF"><a name="2">一个串口通讯的问题? </a></font></td> </tr> <tr> <td>Serial Port Communications?<br> 问<br> I want to build a simple electrical controller which receives input from a<br> sensor through a comm port and either turns a power source(s) on or off<br> based upon this signal. I want this controller to be software in nature.<br> How do I communicate through the port and is it possible to discern changes<br> in voltage.<br> If not, what kind of signal must be input.<br> 答<br> When you want to write and read only binary signals you can use the printer<br> parallel port. For that purpose the Port command is useful. In the below an<br> example of some D1 code used for bidirectional 2 wire bus communication (I2C).<br> BaseAddress is $278, $378 or $3BC, depending on the LPT port used for<br> communication.<br> There is a 'but'. In D1 the port function was available but not documented. In<br> D2 and D3 it seems to have disappeared entirely (Please somebody correct me if<br> this is wrong).<br> We are using the parallel printer port with attached a small interface card<br> with some I/O buffering for control of RF modules. Could somebody indicate<br> whether the Port function still exist or what the alternative could be ?<br> regards,<br> Hans Brekelmans<br> PROCEDURE SetIICline(Terminal: IICterminalTypes; High: Boolean);<br> Var Count : Word;<br> CtrlAddress: word;<br> Begin { set iic line }<br> CtrlAddress:=BaseAddress+2;<br> Case Terminal of<br> SCL : if High then Port[CtrlAddress]:=$08 else Port[CtrlAddress]:=$00;<br> SDA : if NOT High then Port[BaseAddress]:=$80 else Port[BaseAddress]:=$00;<br> END;<br> For Count := 1 to ClockDelay do;<br> End; {SetIICline}<br> FUNCTION GetIICline(Terminal: IICterminalTypes): Boolean;<br> const SDA_IN=$80; { SDA: 25 pin #11, status, NOT BUSY, bit 7 }<br> SCL_IN=$08; { SCL: 25 pin #15, status, NOT Error, bit 3 }<br> var Count : Word;<br> ReadAddress: word;<br> Begin<br> ReadAddress:=BaseAddress+1;<br> CASE Terminal OF<br> SCL: GetIICline:=((Port[ReadAddress] AND SCL_IN) = SCL_IN);<br> SDA: GetIICline:=((Port[ReadAddress] AND SDA_IN) = SDA_IN); { read sda<br> pin }<br> END;<br> For Count := 1 to ClockDelay do;<br> End;<br> </td> </tr> <tr> <td><font color="0000FF"><a name="3">得到本机IP地址? </a></font></td> </tr> <tr> <td>How about using winsockets?<br> This code is untested and ugly.<br> program get_ip;<br> uses<br> winsock,sysutils;<br> VAR<br> ch : ARRAY[1..32] OF Char;<br> i : Integer;<br> WSData: TWSAData;<br> MyHost: PHostEnt;<br> begin<br> IF WSAstartup(2,wsdata)<>0 THEN<br> BEGIN<br> Writeln('can''t start Winsock: Error ',WSAGetLastError);<br> Halt(2);<br> END;<br> try<br> IF getHostName(@ch[1],32)<>0 THEN<br> BEGIN<br> Writeln('getHostName failed');<br> Halt(3);<br> END;<br> except<br> Writeln('getHostName failed');<br> halt(3);<br> end;<br> MyHost:=GetHostByName(@ch[1]);<br> IF MyHost=NIL THEN<br> BEGIN<br> Writeln(GetHostName('+StrPas(@ch[1])+') failed : Error<br> '+IntToStr(WSAGetLastError));<br> Halt(4);<br> END<br> ELSE<br> BEGIN<br> Write('address ');<br> FOR i:=1 TO 4 DO<br> BEGIN<br> Write(Ord(MyHost.h_addr^[i-1]));<br> IF i<4 THEN<Br> write('.')<br> ELSE<br> writeln;<br> END;<br> END;<br> end.<br> </td> </tr> <tr> <td><font color="0000FF"><a name="4">任何动态改变/添加网络设置中的 TCP/IP 的 DNS 地址</a></font></td> </tr> <tr> <td>例如,把 DNS Server的地址添加为192.0.0.1和192.1.1.0,可调用:<br> SetTCPIPDNSAddresses('192.0.0.1 192.1.1.0') ;<br> // 各地址之间用一个空格隔开<br> 1. SetTCPIPDNSAddresses 定义如下:<br> procedure SetTCPIPDNSAddresses( sIPs : string );<br> begin<br> //<br> // if using Windows NT<br> //<br> SaveStringToRegistry_LOCAL_MACHINE(<br> 'SYSTEM\CurrentControlSet' +<br> '\Services\Tcpip\Parameters',<br> 'NameServer',<br> sIPs );<br> //<br> // if using Windows 95<br> //<br> SaveStringToRegistry_LOCAL_MACHINE(<br> 'SYSTEM\CurrentControlSet' +<br> '\Services\VxD\MSTCP',<br> 'NameServer',<br> sIPs );<br> end;<br> 2. 其中 SaveStringToRegistry_LOCAL_MACHINE 定义:<br> uses Registry;<br> procedure SaveStringToRegistry_LOCAL_MACHINE(<br> sKey, sItem, sVal : string );<br> var<br> reg : TRegIniFile;<br> begin<br> reg := TRegIniFile.Create( '' );<br> reg.RootKey := HKEY_LOCAL_MACHINE;<br> reg.WriteString( sKey, sItem, sVal + #0 );<br> reg.Free;<br> end;<br> </td> </tr> <tr> <td><font color="0000FF"><a name="5">如何在程序中动态取得Win95/98的网络邻居中的工作组及计算机名?</a></font></td> </tr> <tr> <td>可参考下面代码,或许有所帮助:<br> procedure GetDomainList(TV:TTreeView);<br> var<br> a : Integer;<br> ErrCode : Integer;<br> NetRes : Array[0..1023] of TNetResource;<br> EnumHandle : THandle;<br> EnumEntries : DWord;<br> BufferSize : DWord;<br> s : string;<br> itm : TTreeNode;<br> begin<br> { Start here }<br> try<br> With NetRes[0] do begin<br> dwScope :=RESOURCE_GLOBALNET;<br> dwType :=RESOURCETYPE_ANY;<br> dwDisplayType :=RESOURCEDISPLAYTYPE_DOMAIN;<br> dwUsage :=RESOURCEUSAGE_CONTAINER;<br> lpLocalName :=NIL;<br> lpRemoteName :=NIL;<br> lpComment :=NIL;<br> lpProvider :=NIL;<br> end;<br> { get net root }<br> ErrCode:=WNetOpenEnum(<br> RESOURCE_GLOBALNET,<br> RESOURCETYPE_ANY,<br> RESOURCEUSAGE_CONTAINER,<br> @NetRes[0],<br> EnumHandle<br> );<br> If ErrCode=NO_ERROR then begin<br> EnumEntries:=1;<br> BufferSize:=SizeOf(NetRes);<br> ErrCode:=WNetEnumResource(<br> EnumHandle,<br> EnumEntries,<br> @NetRes[0],<br> BufferSize<br> );<br> WNetCloseEnum(EnumHandle);<br> ErrCode:=WNetOpenEnum(<br> RESOURCE_GLOBALNET,<br> RESOURCETYPE_ANY,<br> RESOURCEUSAGE_CONTAINER,<br> @NetRes[0],<br> EnumHandle<br> );<br> EnumEntries:=1024;<br> BufferSize:=SizeOf(NetRes);<br> ErrCode:=WNetEnumResource(<br> EnumHandle,<br> EnumEntries,<br> @NetRes[0],<br> BufferSize<br> );<br> IF ErrCode=No_Error then with TV do try<br> a:=0;<br> Items.BeginUpDate;<br> Items.Clear;<br> Itm:=Items.Add(TV.Selected,string(NetRes[0].lpProvider));<br> Itm.ImageIndex:=0;<br> Itm.SelectedIndex:=0;<br> { get domains }<br> 下面的一个单元定义了一个组件. TNetworkBrowser, 可以枚举hierachical树上所有<br> 的网络资源. 实际上浏览是要花费很长时间的,这您可以通过在WINDOWS资源管理器<br> 中打开"整个网络" 来比较一下. 如果你设置SCOPE属性 为nsContext , 你就可以看到<br> 和网络邻居中一样的机器列表.<br> unit NetBrwsr;<br> interface<br> uses<br> Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;<br> type<br> TNetScope = (nsConnected, nsGlobal, nsRemembered, nsContext);<br> TNetResourceType = (nrAny, nrDisk, nrPrint);<br> TNetDisplay = (ndDomain, ndGeneric, ndServer, ndShare, ndFile, ndGroup,<br> ndNetwork, ndRoot, ndShareAdmin, ndDirectory, ndTree, ndNDSContainer);<br> TNetUsage = set of (nuConnectable, nuContainer);<br> TNetworkItems = class;<br> TNetworkItem = class<br> private<br> FScope: TNetScope;<br> FResourceType: TNetResourceType;<br> FDisplay: TNetDisplay;<br> FUsage: TNetUsage;<br> FLocalName: string;<br> FRemoteName: string;<br> FComment: string;<br> FProvider: string;<br> FSubItems: TNetworkItems;<br> public<br> constructor Create;<br> destructor Destroy; override;<br> property Scope: TNetScope read FScope;<br> property ResourceType: TNetResourceType read FResourceType;<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -