网络与通讯编程集锦

检查RS232(串口)是否接有设备关键词:RS232 串口 
在RS232中有4个脚位可用来回应讯号给电脑分別为CTS,DSR,RING,RLSD当未接上设备时,脚位的电太皆为低电压,讯号传回OFF,很多设备都利用此四个脚位与电脑沟通,所以检查脚位电压就知道改COM上是否有设备存在
MS_CTS_ON,MS_DSR_ON,MS_RING_ON,MS_RLSD_ON
procedure TForm1.Button1Click(Sender: TObject);
var
cc:TCommConfig;
hComm:THandle;
Com:String;
lS:dword;
begin
Com:='COM2';
hComm:=CreateFile(Pchar(Com),Generic_read or Generic_write,0,nil,open_existing,0,0);
if GetCommModemStatus(hcomm,lS) then
begin
if(ls and MS_CTS_ON)=MS_CTS_ON then
begin
Button1.Caption:='CTSON'
end;
end;
closeHandle(hcomm);
end;

end.
2.检查Handle所得到的值
procedure TForm1.Button1Click(Sender: TObject);
var
cc:TCommConfig;
hComm:THandle;
Com:String;
lS:dword;
begin
Com:='COM2';
hComm:=CreateFile(Pchar(Com),Generic_read or Generic_write,0,nil,open_existing,0,0);
if(hComm=invalid_Handle_value) then
begin
showmessage('通讯口错误);
end;
closeHandle(hcomm);
end; 

 
如何获取本机的IP地址关键词:IP winsock 
uses winsock;

procedure GetComputerNameAndIP;
var
  wVersionRequested: WORD;
  wsaData: TWSAData;
  p: PHostEnt;
  s: array[0..128] of char;
  p2: pchar;
  OutPut: array[0..100] of char;
begin
  {Start up WinSock}
  wVersionRequested := MAKEWORD(1, 1);
  WSAStartup(wVersionRequested, wsaData);

  {Get the computer name}
  GetHostName(@s, 128);
  p := GetHostByName(s);

  {Get the IpAddress}
  p2 := iNet_ntoa((PInAddr(p^.h_addr_list^))^);
  StrPCopy(OutPut, 'Hostname: ' + Format('%s', [p^.h_Name]) + #10#13 +
    'IPaddress: ' + Format('%s', [p2]));
  WSACleanup;
  MessageBox(0, OutPut, 'NetInfo', mb_ok or mb_iconinformation);
end;

 

 
如何判断一个机器的MSSQL是否启动//判断一个机器的MSSQL是否启动,通过SQL DMO是可以的,但对于没有装MSSQL的客户端来说就没办法,此处用的是连接MSSQL的1433端口,如果端口号不同,可以通过传递端口.
unit Judge_U;

interface
uses
  SysUtils, Classes, IdBaseComponent, IdComponent, IdTCPConnection, IdIcmpClient,
  IdTCPClient, IdRawBase, IdRawClient;


  function JudgePort(AServerName: PChar; APort: Integer): Boolean;
  function JudgePing(AServerName: PChar): Boolean;
implementation

function JudgePing(AServerName: PChar): Boolean;//这个是用来PIN计算机的.
var
  ICMP: TIdIcmpClient;
begin
  ICMP := TIdIcmpClient.Create(nil);
  ICMP.ReceiveTimeout := 1000;
  ICMP.Host := AServerName;
  try
    ICMP.Ping;
    Result := True;
  except
    Result := False;
  end;
  ICMP.Free;   
end;

function JudgePort(AServerName: PChar; APort: Integer): Boolean;
var
  IdTCPClient1: TIdTCPClient;
begin
  IdTCPClient1 := TIdTCPClient.Create(nil);
  IdTCPClient1.Host := AServerName;
  IdTCPClient1.Port := APort;
  try
    IdTCPClient1.Connect;
    Result := True;
    IdTCPClient1.Disconnect;
  except
    Result := False;
  end;
  IdTCPClient1.Free;
end;

end.
//有以下已知的BUG.
  //1  如果一台计算机上安装了多个实例.
  //2  如果不用TCP/IP协议,而用其它的连接方式,比如典型的命名管道,就无法判断.

 
用Delphi实现文件下载的几种方法笔者最近开发的系统中需要写一个下载文件的功能。以前用BCB调用API写的很烦琐,忽然想起有一个API就可以搞定了,于是一大早就来搜索。这个API就是UrlDownloadToFile。不仅如此,Delphi的一些控件也可以轻松实现下载,如NMHTTP,指定NMHTTP1.InputFileMode := ture; 指定Body为本地文件名,指定Get就可以下载了。下面是详细代码,均出自CSDN。我把它们都整理到这儿,让大家方便查阅。

=================
uses UrlMon;
function DownloadFile(Source, Dest: string): Boolean;
begin
try
Result := UrlDownloadToFile(nil, PChar(source), PChar(Dest), 0, nil) = 0;
except
Result := False;
end;
end;

if DownloadFile('http://www.borland.com/delphi6.zip, 'c:/kylix.zip') then
ShowMessage('Download succesful')
else ShowMessage('Download unsuccesful')

========================
例程:

Uses URLMon, ShellApi;
function DownloadFile(SourceFile, Destfile: string): Boolean;
begin
  try
    Result :=  UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;
  except
    Result := False;
  end;
end;

procedure TForm1.Button1.Click(Sender: TObject);
const
  // URL Location
  SourceFile := 'http://www.google.com/intl/de/images/home_title.gif';
  // Where to save the file
  DestFile := 'c:/temp/google-image.gif';
begin
  if DownloadFile(SourceFile, DestFile) then
  begin
    ShowMessage('Download succesful!');
    // Show downloaded image in your browser
    ShellExecute(Application.Handle,PChar('open'),PChar(DestFile),PChar(''),nil,SW_NORMAL)
  end
  else
    ShowMessage('Error while downloading ' + SourceFile)
end;

=================

加入如下代码:

NMHTTP1.InputFileMode := ture;
NMHTTP1.Body := '本地文件名';
NMHTTP1.Header := 'Head.txt';
NMHTTP1.OutputFileMode := FALSE;
NMHTTP1.ReportLevel := Status_Basic;
NMHTTP1.Proxy := '代理服务器的IP地址';
NMHTTP1.ProxyPort := '代理服务器的端口号';
With NMHTTP1.HeaderInfo do

Begin
Cookie := '';
LocalMailAddress := '';
LocalProgram := '';
Referer := '';
UserID := '用户名称';
Password := '用户口令';
End;

NMHTTP1.Get(‘http://www.abcdefg.com/software/a.zip’);

试试吧,Delphi的目录中有TNMHTTP控件的例子。NT4+,Win95+,IE3+,你可以用URL Moniker的功能。

uses URLMon;

...

OleCheck(URLDownloadToFile(nil,'URL','Filename',0,nil));

其中最后一个参数你还可以传入一个IBindStatusCallback的实现以跟踪下载进度或控制中止下载。简单的场合一句话就搞定了。

--回复得分 0--

BTW, URL Moniker封装了大多数URL,而不是像NMHTTP那样封装协议,因此你可以用URLDownloadToFile下载HTTP,FTP甚至本地文件和局域网文件,还有其他的custom moniker,比如MSITSTORE(MSDN Library的文档moniker实现)。

============
用IdHTTP控件吧!
var
  DownLoadfile:TFileStream;
beginio
  DownLoadfile:=TFileStream.Create('c:/aa.rar',fmCreate);
  IdHTTP1.Get('http://www.sina.com.cn/download/aa.rar',DownLoadFile);
  DownLoadFile.Free;
end;

//---------------------------

程序结束

 
关键词:域名获取IP Use WinSock;

function GetIPFromName(Name: string): string;
var
  WSAData: TWSAData;
  HostEnt: PHostEnt;
begin
  WSAStartup(2, WSAData);
  HostEnt := gethostbyname(PChar(Name));
  with HostEnt^ do
    Result := Format('%d.%d.%d.%d', [Byte(h_addr^[0]),
      Byte(h_addr^[1]), Byte(h_addr^[2]), Byte(h_addr^[3])]);
  WSACleanup;
end; 

 
用Delphi编写局域网中的UDP聊天程序关键词:局域网 UDP 聊天程序 
   Internet盛行的今天,网上聊天已成为一种时尚。同时,各单位已建成了自己的局域网;能否在局域网上实现聊天呢?可以,网上到处都有这种工具。当然,我们可以拥有自己版权的聊天工具。
  User Datagram Protocol (UDP)协议,是一种无连接协议。在Delphi中利用这种协议,可以轻松的编写出聊天程序,以下的程序,在Delphi 5+Pwin98中通过。
  打开Delphi,新建Application
放置以下几个控件:Panel1、Panel2,其属性如下:
  然后,放置以下控件:
Edit1
ListBox1
Memo1
Button1
Button2
BitBtn1
Nmudp1
    其主要控件的属性如下:
  各主要控件的功能如下:
现在的界面如下:
源程序如下:
unit main;
interface
uses
Windows,messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,StdCtrls,Buttons,ExtCtrls,NMUDP,Menus,ComCtrls,WinSock; file://增加WinSock
type
TForm1 = class(TForm)
NMUDP1: TNMUDP;
Panel1: TPanel;
Panel2: TPanel;
Label1: TLabel;
Edit1: TEdit;
BitBtn1: TBitBtn;
Memo1: TMemo;
Panel3: TPanel;
Panel4: TPanel;
ListBox1: TListBox;
Button1: TButton;
Button2: TButton;
procedure FormShow(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure NMUDP1DataReceived(Sender: TComponent; NumberBytes: Integer;
FromIP: String; Port: Integer);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ComputerName: array[0..127] of Char;
implementation
{$R *.DFM}
procedure TForm1.FormShow(Sender: TObject);
var
sz: dword;
begin
sz := SizeOf(Computername);
GetComputerName(ComputerNamesz);//得到本机的标识
ListBox1.Items.Clear;
ListBox1.Items.Add(’大家’);//在网友清单中,增加”大家”和
ListBox1.Items.Add(ComputerName);//本机名称
ListBox1.ItemIndex:=0;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
var
MyStream: TMemoryStream;
TmpStr: String;
i:integer;
Begin
if Edit1.Text<>’’ then file://如果所说的内容不为空则发送。
begin
  NMUDP1.ReportLevel := Status_Basic;
  NMUDP1.RemotePort :=8888;//端口为:8888,可以自己定义,但必须与LocalPort相一致。
  if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then
    Edit1.Text:=ComputerName+’自言自语道:’+Edit1.Text file://如果和自己对话.
  Else
    Edit1.Text:=ComputerName+’对’+ListBox1.Items[listbox1.itemindex]+’说:’+Edit1.Text;
  TmpStr :=Edit1.text;
  MyStream := TMemoryStream.Create;
  try
     MyStream.Write(TmpStr[1],Length(Edit1.Text));
     if ListBox1.ItemIndex=0 then  begin
       for i:=1 to ListBox1.Items.Count-1 do begin file://如果选择”大家”,则对所有的网友发送信息
         NMUDP1.RemoteHost :=ListBox1.Items[i];//远程主机的名称或地址.
         NMUDP1.SendStream(MyStream);//发送信息.
       End;
     end
     else begin 如果私聊
        NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex]; file://仅对所选中的网友.
        NMUDP1.SendStream(MyStream);
      End;
  finally
    MyStream.Free;
  end;
  Edit1.Text:=’’;
  Edit1.SetFocus;
end
else
Edit1.SetFocus;
end;
procedure TForm1.NMUDP1DataReceived(Sender: TComponent;NumberBytes: Integer; FromIP:String; Port: Integer);
var
MyStream: TMemoryStream;
TmpStr: String;
begin
MyStream := TMemoryStream.Create;
try
  NMUDP1.ReadStream(MyStream);
  SetLength(TmpStrNumberBytes);
  MyStream.Read(TmpStr[1]NumberBytes);
  Memo1.Lines.Add(TmpStr); file://显示对话的内容.
finally
  MyStream.Free;
end;
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
MyStream: TMemoryStream;
TmpStr: String;
i:integer;
Begin
if (key=#13) and (Edit1.Text<>’’) then file://如果所说的内容不为空,且最后一个按键为”Enter”则发送。
begin
  NMUDP1.ReportLevel := Status_Basic;
  NMUDP1.RemotePort :=8888;
  if ListBox1.Items[ListBox1.ItemIndex]=ComputerName then
    Edit1.Text:=ComputerName+’自言自语道:’+Edit1.Text
  else
    Edit1.Text:=ComputerName+’对’+ListBox1.Items[listbox1.itemindex]+’说:’+Edit1.Text;
  TmpStr :=Edit1.text;
  MyStream := TMemoryStream.Create;
  try
    MyStream.Write(TmpStr[1],Length(Edit1.Text));
    if ListBox1.ItemIndex=0 then begin
      for i:=1 to ListBox1.Items.Count-1 do begin
         NMUDP1.RemoteHost :=ListBox1.Items[i];
         NMUDP1.SendStream(MyStream);
      end;
    end
    else begin
       NMUDP1.RemoteHost :=ListBox1.Items[ListBox1.itemindex];
       NMUDP1.SendStream(MyStream);
    end;
  finally
    MyStream.Free;
  end;
  Edit1.Text:=’’;
  edit1.SetFocus;
end
else
Edit1.SetFocus;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
InputString:String;
begin file://增加网友,输入的可以是IP地址或计算机名称。
  InputString:=InputBox(’增加人员’,’IP地址或计算机名’,’’);
  if Inputstring<>’’ then ListBox1.Items.Add(Inputstring);
    ListBox1.ItemIndex:=0;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin file://删除当前选中的网友,但”大家”不能被删除.
if ListBox1.ItemIndex<>0 then
  ListBox1.Items.Delete(ListBox1.ItemIndex);
end;
end.
    这样,一个简单的聊天工具就做好了,只要双方同时运行本程序,且将对方的计算机名称或IP地址加入到网友中即可实现实时聊天了一个属于自己版权的聊天程序,就这样编写成功了。程序运行时,自动加入两个网友:”大家”和本地计算机名称.当然,你可以增加更多的内容,使程序更加的完善,以求更多的功能。 
 

 
 2006-6-19 13:06:03    列出本机所有的Ip地址关键词:IP  
unit Unit1;
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,winsock;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
  TaPInAddr = Array[0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;


procedure TForm1.Button1Click(Sender: TObject);
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  Buffer: Array[0..63] of Char;
  I: Integer;
  GInitData: TWSAData;
  st:TstringList;
begin
    WSAStartup($101, GInitData);
    st:=TStringList.Create;
    GetHostName(Buffer, SizeOf(Buffer));
    phe := GetHostByName(buffer);
    if phe = nil then
    begin
        Exit;
    end;
    pPtr := PaPInAddr(phe^.h_addr_list);
    I := 0;
    while pPtr^[I] <> nil do
    begin
        st.Add(inet_ntoa(pptr^[I]^));
        showmessage(st.strings[i]);
        Inc(I);

    end;
    WSACleanup;
end;
end.

 
用Delphi编写点对点传文件程序文章摘要:
 Delphi功能强大,用Delphi写软件,可以大大缩短软件的开发周期。本文介绍怎样用Delphi编写点对点传文件程序。 

--------------------------------------------
 

    Delphi功能强大,用Delphi写软件,可以大大缩短软件的开发周期。关于点对点传文件的基本思路,就是一个服务器软件,一个客户端软件,使用同一个端口,待连接上以后,客户端给服务器发送一个请求,包括待传的文件的文件名,大小等,如果服务器接受,就开始传文件。当然,文件传输的时候可以有两种模式,ASCII码和Bin,不过一般通用Bin 就可以了。基于上面的讨论,本来用Delphi4的NMStrm,NMStrmServ 控件就可以完成,但是我测试过了,NMStrm控件对于较小的文件还可以使用,而且很方便,但是如果文件一大(1M)就会出错。所以接下来我们利用Delphi中TServerSocket和TClientSocket写这个程序由于以太包大小的限制以及DelphiSocket的处理机制(Delphi中,当你用一个Socket发送一个较大的Stream,接受方会激发多次OnRead事件,Delphi她只保证多次OnRead事件中每次数据的完整,而不会自己收集数据并返回给用户。所以不要以为你把待传文件在一个Socket中Send一次,另一个中Recv一次就可以了。你必须自己收集数据或自己定义协议。),所以我们采用自定义协议的方法。定义协议的规范方法是利用Record End。如:

TMyFileProtocol=Record
sSendType=(ST_QUERY,ST_REFUSE,ST_DATA,ST_ABORT,...);
iLength:integer;
bufSend:Buffer;
End;
  我曾试过这个办法,但失败了,而且我一直认为我的方法是正确的,但程序一直编译通不过,估计是Delphi有问题:) 所以我在下列的范例程序中利用另外一种办法。Socket 类中有两属性ReceiveText和ReceiveBuf,在一个OnRead事件中,只能使用一次该两属性,所以我们可以利用一个全程变量来保存是该读Text还是Buf,也就是说读一次Text,再都一次Buf,这就模拟了TMyFileProtocol。


开始程序:
写一个最简单的,主要用于讲解方法。
定义协议:
Const
MP_QUERY =’1’;
MP_REFUSE =’2’;
MP_ACCEPT =’3’;
MP_NEXTWILLBEDATA=’4’;
MP_DATA =’5’;
MP_ABORT =’6’;
MP_OVER =’7’;
MP_CHAT =’8’;

协议简介:
首先由Client发送MP_QUERY,Server接受到后发送MP_ACCEPT或MP_FEFUESE;
Client接受到MP_ACCEPT发送MP_FILEPROPERTY,Server接受到后发送MP_NEXTWILLBEDATA;
Client接受到发送MP_NEXTWILLBEDATA,Server接受到后发送MP_DATA;
Client接受到MP_DATA,发送数据,Server接受数据,并发送MP_NEXTWILLBEDATA;
循环,直到Client发送MP_OVER;
中间可以互相发送MP_CHAT+String;

Server程序:
放上以下控件:SaveDialog1,btnStartServer,
ss,(TServerSocket)

btnStartServer.onClick(Sender:TObject);
begin
ss.Port:=2000;
ss.Open;
end;

ss.OnClientRead(Sender: TObject;Socket: TCustomWinSocket);
var
sTemp:string;
bufRecv:Pointer;
iRecvLength:integer;
begin
if bReadText then
begin
sTemp:=Socket.ReceiveText;
case sTemp[1] of
MP_QUERY:begin
file://在这里拒绝
SaveDialog1.FileName:=Copy(sTemp,2,Length(STemp));
if SaveDialog1.Execute then
begin
Socket.SendText(MP_ACCEPT);
fsRecv:=TFileStream.Create(SaveDialog1.FileName,fmCreate);
end
else Socket.SendText(MP_REFUSE+’去死’);
end;
MP_FILEPROPERTY:begin
file://要发送StrToInt(Copy(sTemp,2,Length(sTemp))) 次
file://时间进度显示。。。
Socket.SendText(MP_NEXTWILLBEDATA);
end;
MP_NEXTWILLBEDATA:begin
Socket.SendText(MP_DATA);
bReadText:=false;
end;
MP_END:begin
fsRecv.Free
bReadText:=true;
end;
MP_ABORT:begin
fsRecv.Free;
bReadText:=true;
end;
MP_CHAT:begin
file://Chat Msg
end;
end;{of case}
end
else begin
try
GetMem(bufRecv,2000);//2000 must >iBYTESEND
Socket.ReceiveBuf(bufRecv^,iRecvLength);
fsRecv.WriteBuffer(bufRecv^,iRecvLength);
finally
FreeMem(bufRecv,2000);
end;{of try}
bReadText:=true;
Socket.SendText(MP_NEXTWILLBEDATA);
end;
end;

Client程序:
放上以下控件:edtIPAddress,OpenDialog1,btnConnect,btnSendFile,
cs. (TClientSocket)

btnConnect.onClick(Sender:TObject);
begin
cs.Address:=edtIPAddress.Text;
cs.Port:=2000;
cs.Connect;
end;

btnSendFile.onClick(Sender:TObject);
begin
if OpenDialog1.Execute then
Begin
cs.Socket.SendText(MP_QUERY+OpenDialog1.FileName);//FileSize???
end;
end;

cs.OnRead(Sender: TObject;Socket: TCustomWinSocket);
var
sTemp:string;
bufSend:pointer;
begin
sRecv:=Socket.ReceiveText;
Case sRecv[1] of
MP_REFUSE:ShowMessage(’Faint,be refused!’);
MP_ACCEPT:begin
fsSend:=TFileStream.Create(OpenDialog1.FileName,fmOpen);
file://iBYTEPERSEND是个常量,每次发送包的大小。
Socket.SendText(MP_FILEPROPERTY+Trunc(fsSend.Size/iBYTEPERSEND)+1);
end;
MP_NEXTWILLBEDATA:begin
Socket.SendText(MP_NEXTWILLBEDATA);
end;
MP_DATA:begin
try
GetMem(bufSend,iBYTEPERSEND+1);
if (fsSend.Position+1+iBYTEPERSEND) < fsSend.Size then
begin
fsSend.Read(bufSend^,iBYTEPERSEND);
Socket.SendBuf(bufSend^,iBYTEPERSEND);
fsSend.Free;
end//普通的发送,大小为iBYTEPERSEND
else begin
fsSend.Read(bufSend^,fsSend.Size-fsSend.Position-1);
Socket.SendBuf(bufSend^,fsSend.Size-fsSend.Position-1);
end;//最后一次发送,发送剩余的数据
finally
FreeMem(bufSend,iBYTEPERSEND+1);
end;{of try}
end;
MP_ABORT:begin
file://被取消了:(
fsSend.Free;
end;
end;{of case}
end;


整理程序:
  加入错误判断,优化程序,把Server和Client联合在一起,加入剩余时间进度显示,做成能一次传多个文件,加入聊天功能,就成了一个很好的点对点传文件的程序。
 

 
Delphi怎样实现解析IP地址为主机域名关键词:IP主机域名 
使用 WinSock 单元;
过程如下:
  function IPAddrToName(IPAddr : String): String;
  var
    SockAddrIn: TSockAddrIn;
    HostEnt: PHostEnt;
    WSAData: TWSAData;
  begin
    WSAStartup($101, WSAData);
    SockAddrIn.sin_addr.s_addr:= inet_addr(PChar(IPAddr));
    HostEnt:= gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET);
    if HostEnt<>nil then
    begin
      result:=StrPas(Hostent^.h_name)
    end
    else
    begin
      result:='';
    end;
  end;


测试时请在在线状态。

测试代码:
var
  Name: string;
begin
  Name := InputBox('输入对方主机IP', '主机IP地址:', '');
  showmessage(IpAddrToName(Name));
end;

 

阅读更多
个人分类: 技术
想对作者说点什么? 我来说一句

VBA API 32 Serialport MT

2018年05月07日 0B 下载

Visual C# .NET精彩编程实例集锦

2006年02月23日 18.68MB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭