delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks

#

TIUDPClient使用过程中出了一个问题,请教一下怎么解决 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061211224340148.html
报错如下  
  ‘SocketError   #   10054   Connection   reset   by   peer’  
  使用过程:  
  使用TIUDPClient发送数据,并使用ReceiveString接受服务器反馈信息。  
  我把ReceiveString放到一个过程中处理,此过程由TTimer控制  
  procedure   TForm1.DrawinCode;  
  var  
      Str:   String;  
      IP:   String;  
      Port:   Integer;  
  begin  
      Timer_Drawin.Enabled   :=   False;  
      Str   :=   UDPClient.ReceiveString(IP,   Port);  
      ......  
      Timer_Drawin.Enabled   :=   True;  
  end;  
  关闭窗口时  
  procedure   TForm1.FormClose(Sender:   TObject;   var   Action:   TCloseAction);  
  begin  
      UDPClient.Send(UDPClient.Binding.IP,   UDPClient.Binding.Port,   '0');  
  end;  
  来结束最后一次监听;  
   
  ‘SocketError   #   10054   Connection   reset   by   peer’  
  错误在其他地方使用UDPClient发送数据时不定时出现,只能确定问题出在DrawinCode过程中,因为注释掉Str   :=   UDPClient.ReceiveString(IP,   Port);就没事,但不知道怎么解决,请大家帮忙解决下,谢谢。

我查了一下,问题不是我想象的那么简单。就此结帖把。我多查查相关资料。进来的第一个得分结帖

呵呵

好象是个BUG,如果不影响运行就不要紧,如果运行EXE也有这提示,就用Try把它吃掉好了

posted @ 2008-10-28 09:56 delphi2007 阅读(285) | 评论 (0)编辑 收藏

技术散分:Delphi中用API实现在MSN的信息提示 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061211171215149.html
我是比较喜欢用MSN的,因为它的信息提示比较独特,所有的聊天软件都是弹出一个常规的Windows对话框,而它却好像是从任务栏里冒出来的。想想了,在Delphi这样的纯OOP工具里加一个API应该不难实现,花了十来分钟终于搞出来了,以下是实现方法:    
   
    1、建立一个APPLICATION,将两个按钮放置到主窗体FROM1中,分别为button1和button2。  
   
  button1.caption:=′打开窗口′;  
  button2.caption:=′关闭窗口′;    
   
    2、在file菜单项中的new中添加窗体form2,并且在project中的options里,将form2设置为Available   froms。  
   
    3、以下是FORM2窗体内的控件及属性设置  
   
  form2.borderstyle:=bsNone;    
   
    添加panel1  
   
  panel1.align:=alclient;  
  panel1.bevellnner:=bvLowered;    
   
    可以在panel1内添加你想要的文字。  
   
    OK,打开FORM2的代码窗口,代码如下:  
   
  unit   Unit2;  
   
  interface  
   
  uses  
  Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
  Dialogs,   ExtCtrls,   jpeg,   StdCtrls;  
   
  type  
  TForm2   =   class(TForm)  
  Panel1:   TPanel;  
  Image1:   TImage;  
  Label1:   TLabel;  
  procedure   Label1Click(Sender:   TObject);  
  procedure   Image1Click(Sender:   TObject);  
  private  
  {   Private   declarations   }  
  public  
  procedure   Show;  
  procedure   close;  
  {   Public   declarations   }  
  end;  
   
  var  
  Form2:   TForm2;  
   
  implementation  
  procedure   tform2.close;  
  begin  
  if   AnimateWindow(Handle,200,AW_VER_POSITIVE+AW_HIDE)=false   then  
  begin  
  showmessage(′窗体退出出错′);  
  free;  
  end;  
  inherited   close;  
  end;  
  procedure   tform2.Show;  
  begin  
  top:=430;  
  left:=560;  
  if   AnimateWindow(Handle,200,AW_VER_NEGATIVE)=false   then  
  begin  
  showmessage(′窗体显示出错′);  
  free;  
  end;  
  inherited   show;  
  end;  
  {$R   *.dfm}    
   
    以上红色的区域为具体实现特效的代码。为FORM1添加如下代码即可:  
   
  unit   Unit1;  
   
  interface  
   
  uses  
  Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
  Dialogs,   StdCtrls;  
   
  type  
  TForm1   =   class(TForm)  
  Button1:   TButton;  
  Button2:   TButton;  
  procedure   Button1Click(Sender:   TObject);  
  procedure   Button2Click(Sender:   TObject);  
  private  
  {   Private   declarations   }  
  public  
  {   Public   declarations   }  
  end;  
   
  var  
  Form1:   TForm1;  
   
  implementation  
   
  uses   Unit2;  
  var  
  mesfrm:tform2;  
  {$R   *.dfm}  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
  mesfrm:=tform2.Create(application);  
  mesfrm.Show;  
  end;  
   
  procedure   TForm1.Button2Click(Sender:   TObject);  
  begin  
  mesfrm.close;  
  end;  
   
  end.    
   
    OK,运行程序你已经可以看到效果了,不过记得将显示器设为800*600象素呵。  
   
    由于制作时间较短,只实现了基本的效果,但稍加修改便可和MSN的信息提示一模一样。  
 

ding

板凳先~~~~~

posted @ 2008-10-28 09:56 delphi2007 阅读(116) | 评论 (0)编辑 收藏

获取 网络连接速度 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061211144729150.html
delphi   如何做到获取或者测试当前电脑的网络速度呢.具体的网速的大小如何获取呢?

这个是交换机上设置的   你要有权限..    
  本地网卡的   速度可以的

posted @ 2008-10-28 09:56 delphi2007 阅读(315) | 评论 (0)编辑 收藏

谁有用DELPHI发ARP包的源代码 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061216102243111.html
我知道PACKET.dll里有个packetsendpacket,不知道参数如何填,请大侠指教,加分多多!  
 

来混分  
   
  __published:  
                  TButton   *Button1;  
                  void   __fastcall   Button1Click(TObject   *Sender);  
              private:  
                  typedef   unsigned   long(__import   __stdcall   Fun_2ul2ulPtrTOul)(unsigned   long,unsigned   long,unsigned   long*,unsigned   long*);  
                  Fun_2ul2ulPtrTOul   *Func1;  
                  bool   fromIPtoMAC(String&);  
              public:  
                  __fastcall   Tmain_(TComponent*   Owner);  
  ###################################################################  
    bool   Tmain_::fromIPtoMAC(String&   S)  
  {             HINSTANCE   hIphlpapiDll;  
              hIphlpapiDll=LoadLibrary("iphlpapi.dll");  
              if(hIphlpapiDll==NULL)  
              {  
                  FreeLibrary(hIphlpapiDll);  
                  S="好像没有找到iphlpapi.dll";  
                  return   false;  
              }  
   
              unsigned   long   Rt,L_id,*L_MAC,L_phyAddrLen;  
              Rt=-1;  
              L_id=inet_addr(S.c_str());//   inet_appr   #include       <winsock2.h>  
              if(L_id==INADDR_NONE)  
              {  
                  FreeLibrary(hIphlpapiDll);  
                  S="无效IP地址--"+S;  
                  return   false;  
              }  
              __int64   x=0;  
              L_MAC=reinterpret_cast<unsigned   long*>(&x);  
              L_phyAddrLen=6;  
   
              (FARPROC   &)Func1=GetProcAddress     (hIphlpapiDll,"SendARP");                                    
  Rt=Func1(L_id,0,L_MAC,&L_phyAddrLen);  
              if(Rt!=0)  
              {  
                  FreeLibrary(hIphlpapiDll);  
                  S="没找到机器--"+S;  
                  return   false;  
              }  
   
              String   Str_MAC;  
              Str_MAC=IntToHex(x,8).SubString(1,12);  
              Str_MAC=Str_MAC.Length()<12?"0"+Str_MAC:Str_MAC;  
              S=S+"     "+Str_MAC;  
   
              FreeLibrary(hIphlpapiDll);  
              return   true;  
          }  
 

关中刀客的这段代码,我没看明白,好像不完整,是否下面还有.要是能翻译成DELPHI就好了.

Windows   中可以直接发二层的包吗?(学习中...)

const   INADDR_NONE   =   $FFFFFFFF;  
   
  function   SendARP(const   DestIP:   DWord;  
      const   SrcIP:   DWord;  
      const   pMacAddr:   Pointer;  
      const   PhyAddrLen:   PULONG):   DWord;   stdcall;   external   'IPHLPAPI.DLL'   name   'SendARP';  
   
  function   inet_addr(const   cp:   PChar):   DWord;   stdcall;   external   'WS2_32.DLL'   name   'inet_addr';  
   
  procedure   TForm1.Button1Click(Sender:   TObject);  
  var  
      dwResult:   DWord;  
      ulIPAddr:   DWord;  
      ulMACAddr:   array[0..5]   of   Byte;  
      ulAddrLen:   ULONG;  
  begin  
      ulIPAddr   :=   inet_addr(PChar(Edit1.Text));  
  //     ShowMessage(IntToHex(ulIPAddr,   8));  
      if   ulIPAddr   =   INADDR_NONE   then  
            begin  
                MessageDlg('Invalid   IP   address',   mtError,   [mbOK],   0);  
                Exit;  
            end;  
      ulAddrLen   :=   6;  
      dwResult   :=   SendARP(ulIPAddr,   0,   @ulMACAddr,   @ulAddrLen);  
      if   dwResult   <>   0   then  
            begin  
                MessageDlg('Error   in   send   ARP   request',   mtError,   [mbOK],   0);  
                Exit;  
            end;  
      ShowMessage('MAC   address   :   '   +  
          IntToHex(ulMACAddr[0],   2)   +   ':'   +  
          IntToHex(ulMACAddr[1],   2)   +   ':'   +  
          IntToHex(ulMACAddr[2],   2)   +   ':'   +  
          IntToHex(ulMACAddr[3],   2)   +   ':'   +  
          IntToHex(ulMACAddr[4],   2)   +   ':'   +  
          IntToHex(ulMACAddr[5],   2));  
  end;

我来混分

谢谢ly_liuyang兄,这段代码是获取指定IP的MAC,这个我会,我要的是向指定IP发送ARP欺骗包,不知哪会大仙做过,望不吝赐教,或直接发至我的邮箱:mail@net9999.com,加分无数

俺用Delphi和wincap包写过一个,只是不知道放哪了。哪天找到了,就给你。不过,你自己也可以看看Wincap包,其实挺简单的。

用Delphi和wincap包中PacketReceivePacket函数接包时出现内存泄漏。  
  这是扫描什么原因?

ly_liuyang:  
   
  我测试过你的代码,在同一网段没有问题,隔网段就有ARP错误!得不到MAC  
   
  还请指教阿!

fengxue291080(为分而来。。。。。。),你说的“在同一网段没有问题,隔网段就有ARP错误!得不到MAC”,你补补网络基础方面的课吧。  
   
 

arp协议是广播型的,是不能跨网段的

SendARP,   获取指定IP对应的MAC

不是楼主需要的

posted @ 2008-10-28 09:56 delphi2007 阅读(230) | 评论 (0)编辑 收藏

如何屏蔽ClientSocket连接服务器失败出现的10061错误。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215222359112.html
在   OnError   中使用   ErrorCode   :=   0;   也不行。  
   
  听人说,阻塞和非阻塞屏蔽错误的办法不一样。但我不太了解~  
   
  请各位知道朋友指点一下,先谢谢了。

用  
  Try  
  Except  
  end;  
  也不可以屏蔽吗?  
   
  另外,可以用Indy试试,很不错的。  
   
   
  ---------------------------------  
  http://kmok.cn/

to   pilicat(Delphi迷)    
   
  试过,还是不行。我发现   ClientSocket   出现错误时根本就不执行OnError的代码~   郁闷!  
   
  Indy没接触过~   还是习惯这个了。^o^    
   
  谢谢回贴。

我记得我曾经写if   ErrorCode=10061   then   ErrorCode:=   0;   是可以的。我是D6中用的。

posted @ 2008-10-28 09:56 delphi2007 阅读(1139) | 评论 (0)编辑 收藏

求 三 层 式 架 构 方 案 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215172256113.html
三   层   式   架   构   方   案  
  一、实时连接服务器,数据集中存储服务器上,全部客户端只有连接上服务器才可以调用服务器数据,要保证200人在线顺畅运行。  
  二、实现功能:  
  1、以MSSQL示例数据训Pubs里面的employee数据库为例实现添加、删除、修改、查询功能  
  2、客户端可以管理在线用户,可以查询到用户ID、用户名、计算机IP、计算机名、登录时间及离开时间,可以踢掉某个在线用户  
  3、服务器有固定IP的可以用,没有固定IP的用花生壳解析的也可以使用。  
  三、客户端业务模块用DLL来做,由EXE文件调用模块DLL。  
  ========================================================================  
  这个东西谁有现成的,有应用过实际系统的,可以报个价!谢谢

我有需要的三层式加构方案,如果已经有实际的系统在应用,效果良好.如有需要可以联系QQ:55254837,注明是:三   层   式   架   构   方   案.

posted @ 2008-10-28 09:56 delphi2007 阅读(249) | 评论 (0)编辑 收藏

如何用delphi 向网页传递数据 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215171534114.html
比如实现这种样式的提交    
   
  http://www.abc.com/jieshou.asp?user=1221&id=12      
   
  或者直接   post  
   
   
 

办法一:  
  //...  
  WebBrowser1:   TWebBrowser;  
  //....  
  procedure   TForm1.Button1Click(Sender:   TObject);  
  begin  
        WebBrowser1.Navigate('http://www.abc.com/jieshou.asp?user=1221&id=12');  
  end;  
   
  办法二..N   ,楼下的说说

http://www.matlus.com/scripts/website.dll/Tutorials?DelphiTCPIP&IndyMultiPartFormData&5

用IDHTTP控件  
  IDHTTP.get('http://www.abc.com/jieshou.asp?user=1221&id=12   ');  
  或者  
  IDHTTP.Post();

posted @ 2008-10-28 09:56 delphi2007 阅读(337) | 评论 (0)编辑 收藏

ie网页翻页问题----100分求解 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215130854115.html
 
  请教高手:  
   
    我想自动抓取全部网页数据但没成功,只能手动抓取。   另外,我不懂asp编程,能否修改asp程序,与服务器交互,一次全部抓回数据  
  (正常登陆网页,身份验证后一页一页手动翻页,我的程序可以抓取数据,如果能自动翻页并判断网页加载完成时间就可以自动抓取全部数据)  
  1.如何用程序控制ie网页或WebBrowser翻页(asp),当网页加载完成后再翻页,直到最后一页?  
  asp翻页代码是这样的:  
   
  <DIV   id=divpage   align=center><SPAN   style="CURSOR:   hand"   onclick='showpage("page","001")'>1  
  </SPAN>&nbsp;<SPAN   style="CURSOR:   hand"><FONT   color=red>2  
  </FONT></SPAN>&nbsp;<SPAN   style="CURSOR:   hand"   onclick='showpage("page","003")'>3  
  </SPAN>&nbsp;<SPAN   style="CURSOR:   hand"   onclick='showpage("page","004")'>4  
  </SPAN>&nbsp;共   4</FONT>   页</DIV>  
   
   
  2.能否修改或者控制网页代码的运行,或者直接用自己的代码与服务器交互?  
  3.或者依次计算页面按钮的坐标,控制鼠标单击  
  4.或者其他解决办法

XMLHTTPRequest    
  AJAX  
   
  看看吧,不是很难,但需要一点时间

UP   有分

谢谢楼上的,我期望用c++或Delphi

我已经能找到所IHTMLDocument2接口,无法取得HTMLElementEvents2

无解,撤单

不要撤单啊

我的经验是分析网页地址,在地址中总会用分页的部分的。

我做了一套网站数据采集系统  
  本系统可采集网站的产品、新闻等信息,保存到数据库中。系统功能强大,操作方便,容错性高。  
  1、可以定义多个要采集数据的网站;  
  2、可以定义采集数据的页面深度,及采集参数;  
  3、可以处理复杂的翻页情况;  
  4、支持采集任务保存,可以控制采集任务的停止和继续;  
  5、支持将采集数据的网页存为图片,以备人工检查数据;  
  6、支持常用的编码转换;  
  7、支持多种界面风格;  
  8、如果需要可以增加自动登录功能;  
  有意者,请联系QQ:17092674

posted @ 2008-10-28 09:56 delphi2007 阅读(276) | 评论 (0)编辑 收藏

这个问题把我给弄晕了,你不妨尝试一下 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215124520116.html
我用Indy的TIDSMTP和TIDMessage发送电子邮件,但是出现了bad   secquence   of   command错误!我的代码是这样的:  
  procedure   TfrmEmail.SpeedButton7Click(Sender:   TObject);  
  var   Msg:   TIDMessage;  
  begin  
          Msg:=TIDMessage.Create(SMTP);  
          Msg.Clear;  
          Msg.Subject:=edtSubject.Text;     //subject   主题  
          Msg.Body.Assign(memoBody.Lines);   //body   内容  
          Msg.From.Text:=Trim(edtFrom.Text);     //寄件人  
          Msg.Recipients.EMailAddresses:=Trim(edtMailto.Text);   //收信人  
          SMTP.Host:='smtp.163.com';  
          SMTP.AuthenticationType:=atLogin;  
          SMTP.Username:='xaguobo';  
          SMTP.Password:='*******'     ;//这里我输入的是我的163邮箱的登陆密码  
          SMTP.Port:=25;  
          try  
              SMTP.Connect(-1);   //   我跟踪连接服务器成功  
              try  
                  SMTP.Send(Msg);  
                  ShowMessage('邮件已发送');  
              finally  
                  SMTP.Disconnect;  
              end;  
      except  
          on   e:   exception   do  
              ShowMessage('Mail   寄送失敗:'   +   e.Message);  
   
      end;  
   
  end;  
   
  请个位大虾指教!

一直在使用这个发送,很正常——除了邮件服务器拒绝的之外。  
  Indy   10

posted @ 2008-10-28 09:56 delphi2007 阅读(105) | 评论 (0)编辑 收藏

查遍了所有的大富翁和CSDN的贴子,也没能解决的一个线程问题,不要笑我为啥这样做,我只求解决 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215123932117.html
constructor   TThreadgetXML.Create(XMLDoc:   TXMLDocument;   lblIssue,   lblMiniteSecond:   TLabel);  
  begin  
      flblIssue   :=   lblIssue;  
      flblMiniteSecond   :=   lblMiniteSecond;  
      fXMLDoc   :=   XMLDoc;  
      inherited   Create(True);  
  end;  
   
  procedure   TThreadgetXML.Execute;  
  begin  
      try  
          fIdAntiFreeze1   :=   TIdAntiFreeze.Create(nil);  
          fIdHTTP1   :=   TIDHTTP.Create(nil);  
          fIdAntiFreeze1.OnlyWhenIdle   :=   False;  
   
          fXMLDoc.XML.Text   :=  
              fIdHTTP1.Get('http://219.142.177.16:8381/ripado/sale.xml');  
          fXMLDoc.Active   :=   true;  
          flblIssue.Caption   :=   GetIssue;  
          fEndTime   :=   strToInt(GetEndTime);  
          Synchronize(SynChangeTime);  
   
          if   assigned(fIdAntiFreeze1)   then  
              freeAndNil(fIdAntiFreeze1);  
          if   assigned(fXMLDoc)   then  
              freeAndNil(fXMLDoc);  
          if   assigned(fIdHTTP1)   then  
              freeAndNil(fIdHTTP1);  
          Suspend;  
      except  
          strMsg   :=   '网络连接错误!';  
          Synchronize(SynAddInfo);  
      end  
   
  end;  
  显示窗体时我已经创建  
   
  计时器中调用  
    if   endTime   <=   60   then  
      begin  
      //     if   not   assigned(ThreadgetXML)   then  
      //     ThreadgetXML   :=   TThreadgetXML.Create(xmlDoc,   lblissue,   lblminiteSecond);  
          ThreadgetXML.Resume;  
      end  
      else  
          if   not   tmrCountDown.Enabled   then   tmrCountDown.Enabled   :=   true;  
   
  第二次调用就出错了,excute代码上的部分说什么也不会被执行,请大大们帮我!

出了个地址错误,运行不到excute

唉,真没法说你了.在群里问的没完,在这居然也能看到你.看来你真的是问遍了大江南北!  
  inherited   Create(True);这个是把线程挂起了.  
  要想线程序马上执行需要   inherited   Create(false);  
  不过,你的代码有问题:  
  应该写成  
  constructor   TThreadgetXML.Create(XMLDoc:   TXMLDocument;   lblIssue,   lblMiniteSecond:   TLabel);  
  begin  
      inherited   Create(True);  
      flblIssue   :=   lblIssue;  
      flblMiniteSecond   :=   lblMiniteSecond;  
      fXMLDoc   :=   XMLDoc;  
      resume;  
  end;  
   
 

仍然地址错误

if   endTime   <=   60   then  
      begin  
              ThreadgetXML.Resume;//   :=   TThreadgetXML.Create(xmlDoc,   lblissue,   lblminiteSecond);  
      end程序里执行是这样写么?  
   
  还是没有执行到excute

取不到新值

不关注

关键在于Execute执行体,这里应该有个循环,否则Suspend之后线程就会自动结束了。如下:  
   
  procedure   TThreadGetXML.Execute;  
  begin  
      while   not   Terminated   do  
      try  
          ...  
      except  
          ...  
      end;  
  end;

楼上有理

Create函数中加上这个:  
   
  FreeOnTerminate   :=   False;

在Excute中加  
  while   1=1   do  
  begin  
   
  //你的代码;  
  end;

要不没有挂起点,下次从哪执行?

procedure   TThreadgetXML.Execute;  
   
  fIdHTTP1   :=   TIDHTTP.Create(nil);<-放到TThreadgetXML.Create中  
  去掉fIdAntiFreeze1  
  尽量别用Synchronize,用postmessage消息通知界面或者在主界面用Timer刷新数据。  
 

posted @ 2008-10-28 09:56 delphi2007 阅读(125) | 评论 (0)编辑 收藏

用UDP实现在网络上传输文件的问题。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215121855118.html
最近在学通过UDP在网络上传输文件的咚咚,有几个疑惑的地方始终没能弄明白,希望各位大侠能帮忙指点迷津。  
   
  我写了一个文件传输的测试列子,1个idUDPServer做为服务端,2个idUDPClient做为客户端,实现内容是server能接收2个client同时发送的2个不同的文件。  
   
  疑问1:   idUDPClient似乎没有一般socket组件的Connect过程。我查找网上一些UDP传输文件的例子也是如此。  
  我了解到的一些网络通讯步骤一般是   客户端请求连接,服务器回应,客户端确认。之后服务端就会接收并处理来自这个客户端发送的数据,否则应该会丢弃这些数据包,不会作出响应。不知道这是不是就是所谓的握手(我刚接触网络开发,这方面知识实在太贫乏了,临时抱佛教硬了解了些,但很多弄不明白)。  
  但idUDPClient没有Connect过程,那是不是需要我们自己写连接过程呢。要不然随便用一个client向server发送一个随意的数据包,服务端都需要做出响应那不是乱套了。就如一个client正在向server发送文件数据包,如果这个时候用另外一个没有连接的client向server发送一个带有同样包头,但数据体是错误数据的文件数据包,那服务端不是也要接收这些数据,并将错误数据写入文件了。  
   
  疑问2:因为是server同时在接收2个client发送的文件。我在server建立了一个userlist来记录连接的客户端,userlist中的一条记录对应一个客户端和一个文件。但这样每次接收到数据包都需要遍历一次userlist,以便确认需要把文件数据写入哪个文件里面?感觉好像不应该这样,一个数据包就遍历一次,那多个文件同时传输,遍历次数就更多了,势必会消耗很多CPU资源。不知道这有没有什么好的解决方法。  
   
  疑问3:我看到一些UDP可靠数据传输的帖子,里面大都采用了滑动窗口协议。idUDPServer和idUDPClient中是否已经采用了这个协议,还是说需要自己另外写呢。  
 

TCP不行?  
  UDP不可靠的,需要自己现实很多功能,没必要的~  
  UDP模拟TCP?汗一下~

用win   socket   API自己做,少用组件(尤其是当你不了解他的实现细节的时候)

posted @ 2008-10-28 09:56 delphi2007 阅读(454) | 评论 (0)编辑 收藏

用UDP实现在网络上传输文件的问题。 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215121838119.html
最近在学通过UDP在网络上传输文件的咚咚,有几个疑惑的地方始终没能弄明白,希望各位大侠能帮忙指点迷津。  
   
  我写了一个文件传输的测试列子,1个idUDPServer做为服务端,2个idUDPClient做为客户端,实现内容是server能接收2个client同时发送的2个不同的文件。  
   
  疑问1:   idUDPClient似乎没有一般socket组件的Connect过程。我查找网上一些UDP传输文件的例子也是如此。  
  我了解到的一些网络通讯步骤一般是   客户端请求连接,服务器回应,客户端确认。之后服务端就会接收并处理来自这个客户端发送的数据,否则应该会丢弃这些数据包,不会作出响应。不知道这是不是就是所谓的握手(我刚接触网络开发,这方面知识实在太贫乏了,临时抱佛教硬了解了些,但很多弄不明白)。  
  但idUDPClient没有Connect过程,那是不是需要我们自己写连接过程呢。要不然随便用一个client向server发送一个随意的数据包,服务端都需要做出响应那不是乱套了。就如一个client正在向server发送文件数据包,如果这个时候用另外一个没有连接的client向server发送一个带有同样包头,但数据体是错误数据的文件数据包,那服务端不是也要接收这些数据,并将错误数据写入文件了。  
   
  疑问2:因为是server同时在接收2个client发送的文件。我在server建立了一个userlist来记录连接的客户端,userlist中的一条记录对应一个客户端和一个文件。但这样每次接收到数据包都需要遍历一次userlist,以便确认需要把文件数据写入哪个文件里面?感觉好像不应该这样,一个数据包就遍历一次,那多个文件同时传输,遍历次数就更多了,势必会消耗很多CPU资源。不知道这有没有什么好的解决方法。  
   
  疑问3:我看到一些UDP可靠数据传输的帖子,里面大都采用了滑动窗口协议。idUDPServer和idUDPClient中是否已经采用了这个协议,还是说需要自己另外写呢。  
 

UDP模拟TCP?有这个必要??  
  那就自己根据TCP协议弄UDP的应用协议了

用win   socket   API自己做,少用组件(尤其是当你不了解他的实现细节的时候)

posted @ 2008-10-28 09:56 delphi2007 阅读(430) | 评论 (0)编辑 收藏

三层架构奇怪的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215121442120.html
下边是我在中间层中的程序,用于返回数据到客户端。  
  procedure   Tappserverforjb.SelectAllData(const   SQlText:   WideString;  
      var   Vdata:   OleVariant);  
  begin  
      with     DM.ADOQSelect   do  
      begin  
          Close;  
          SQL.Clear;  
          SQL.Text   :=     SQlText;  
          try  
              Open;  
              CldSelect.Active   :=   False;  
              CldSelect.Active   :=   True;  
              Vdata   :=   CldSelect.Data;  
          finally  
              CldSelect.Close;  
              Close;  
          end;  
      end;  
  end;  
   
   
  这是我在客户端调用中间层中的函数。  
  var  
      sqltxt   :string;  
      dataTemp   :   Olevariant;  
  begin  
      sqltxt   :=   'select     sum(Mark_score)   as     Mark_score,Mark_id   from   shiftScore   where   Mark_shift=1     and   Mark_Y='+''''+'2006-01-01'+''''+'   group   by     Mark_id   order   by   Mark_id   ';  
      socketMark.AppServer.SelectAllData(sqltxt,dataTemp);  
      cdstmep.Data   :=dataTemp;  
  end;  
   
  奇怪的是,求和就的不到数据,如果把sum去掉,很正常。那位大哥帮拌解决一下?

是否Mark_score   有Null值?

肯定不是~~  
  刚才又试了一下,加减和avg都没有问题,唯独这个sum。Mark_score是decimal(9,2)。

单独执行sql看能不能得到数据

posted @ 2008-10-28 09:56 delphi2007 阅读(213) | 评论 (0)编辑 收藏

关于分层问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215115937121.html
最近再做关于分层的东西   ,但是以前习惯了一气呵成(哈哈),现在理解分层的东西有点困难,表现层,业务层,数据层,它们是怎样   工作的?怎样通信?如何划分他们之间的   功能?   设计时客户端&服务器要求不再一起,而是分布再两个不同的网段,如何做使他们之间通过DLL封装的接口进行通信???  
    谢谢各位<不知道理解我的意思了没?  
    介绍几本有关的书也好   ,谢谢了

来本书把,网上有电子版的,《DELPHI   5企业级解决方案及应用剖析》

先看看刘艺的<<面向对象的编程思想>>吧.相信你的问题可以在那找到答案.

我看了  
  我觉的刘艺的书一般  
  没看明白怎么回事  
  我太笨吗???难道???

自己琢磨就是难啊

搞进去了就不难

怎么没人讲一下?  
  有经验的朋友说一下吧!  
  我很急用  
 

表现层,业务层,数据层:这是从逻辑上分层;  
  表现层,就是界面了;  
  业务层,业务逻辑喽;  
  数据层,又叫持久层,封装了对数据库的操作;  
   
  设计时客户端&服务器要求不再一起,而是分布再两个不同的网段,如何做使他们之间通过DLL封装的接口进行通信?  
  ------------------------------------------------------  
  物理分层,一般通过DCOM、Corba、Web   Service等等,Delphi还有Midas。

posted @ 2008-10-28 09:56 delphi2007 阅读(136) | 评论 (0)编辑 收藏

关于调用WEB服务超时的问题 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215110614122.html
我用DELPHI的THTTPRIO调用WEB服务,现在我想设置系统的超时时间,设置FHttPRIO.HTTPWebNode.ConnectTimeout属性后,调用WEB服务将失败,出现"---------------------------  
  prjclient  
  ---------------------------  
  传递给系统调用的数据区域太小。   -   URL:http://www.tjqts.com/regtesta/GetSoftInfo.asmx   -   SOAPAction:http://tempuri.org/RegistSoftInfo.  
  ---------------------------  
  确定        
  ---------------------------  
  错误信息.如果不设置此属性将不会出现该错误信息.  
  大家帮忙来看看。在此谢过
posted @ 2008-10-28 09:56 delphi2007 阅读(477) | 评论 (0)编辑 收藏

用indy收邮件的问题,怎么样把邮件存放到本地,最好是存到数据库 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215094636123.html
现在用indy收邮件,邮件是可以收了,但是不知道怎么样最好的保存方法,也不知道foxmail怎么保存的,也   不知道怎么样把他保存到数据库中,感觉他的数据库类型比较麻烦,附件的话是不是一般都不存到数据库中的?  
  请高手指教

可以实现的     等等写个列子给你看~~

//****************************收取指定的邮件************************************  
  function   Trec_mail.Get_Receive(lett_index:   OleVariant):   OleVariant;  
  var  
      nmm_strUidl,nmm_strAttachFileName:string;  
      nmm_strDirName,nmm_strUrlPath:string;  
      nmm_strAttachFileUrl,nmm_strAttachFilePath:widestring;  
      nmm_index:integer;  
      nmm_strbody:widestring;  
      nmm_strdecode:string;  
  begin  
  try  
          nmg_intLetterIndex   :=strtoint(lett_index);   //全局变量邮件id  
          nmm_strUidl   :=   trim(get_uid);  
          nmg_msgBody.clear;  
          nmg_msgBody.NoDecode   :=   false;  
          nmg_msgBody.IsEncoded   :=   true;  
          try  
                nmg_pop.Retrieve(nmg_intLetterindex,nmg_msgBody);  
          except  
                result:='';  
                exit;  
          end;  
          nmg_msgHead.clear;  
          nmg_msgHead.NoDecode   :=   false;  
          nmg_msgHead.IsEncoded   :=   true;  
          try  
              nmg_pop.RetrieveHeader(nmg_intLetterIndex,nmg_msgHead);  
          except  
              result:='';  
              exit;  
          end;  
          if   nmg_strMailUserDir=''   then  
                begin  
                    nmm_strDirName   :=   nmg_strRootDir+nmm_strUidl;  
                    nmm_strUrlPath   :=   nmg_strRootUrlPath+nmm_strUidl;  
                end  
          else  
                begin  
                    nmm_strDirName   :=   nmg_strRootDir+nmg_strMailUserDir+'\'+nmm_strUidl;  
                    nmm_strUrlPath   :=   nmg_strRootUrlPath+nmg_strMailUserDir+'/'+nmm_strUidl;  
                end;  
          ForceDirectories(nmm_strDirName);  
          FormAttachHtm;  
          nmg_blnHasAttOut   :=   false;  
          //*************************正文的下载***************************************  
          try  
              if   nmg_msgBody.messageparts.Count=0   then   nmg_stsContent   :=nmg_msgBody.Body  
              else   begin  
                    for   nmm_index:=0   to   pred(nmg_msgBody.messageparts.Count)   do  
                    if   nmg_msgBody.MessageParts.Items[nmm_index]   is   TIdText   then   nmg_stsContent   :=   TIdText(nmg_msgBody.MessageParts.Items[nmm_index]).Body;  
              end;  
          except  
                result:='';  
                exit;  
          end;  
          if   (pos('HTML>',nmg_stsContent.text))or(pos('html>',nmg_stsContent.text))<1   then     nmg_stsContent.text:='<pre>'+nmg_stsContent.text+'</pre>';  
          //*************************附件的下载***************************************  
          for   nmm_index:=0   to   pred(nmg_msgBody.messageparts.Count)   do  
                  begin  
                          if   (nmg_msgBody.MessageParts.Items[nmm_index]   is   TIdAttachment)   then  
                                  begin  
                                          nmm_strAttachFileName   :=DecodeHeader(TIdAttachment(nmg_msgBody.MessageParts.Items[nmm_index]).Filename);  
                                          nmm_strAttachFileUrl   :=   nmm_strUrlPath;  
                                          nmm_strdecode:=(tidattachment(nmg_msgBody.MessageParts.Items[nmm_index]).ContentDisposition);  
                                          if   trim(nmm_strdecode)<>''   then  
                                                begin  
                                                      nmm_strAttachFilePath   :=   nmm_strDirName   +   '\attachment\'+inttostr(nmm_index);  
                                                      ForceDirectories(nmm_strAttachFilePath);  
                                                      nmm_strAttachFileUrl   :=   nmm_strAttachFileUrl+'/attachment/'+inttostr(nmm_index)+'/'+nmm_strAttachFileName;  
                                                      nmm_strAttachFilePath   :=   nmm_strAttachFilePath+'\'+nmm_strAttachFileName;  
                                                      try  
                                                      if   not   fileexists(nmm_strAttachFilePath)   then  
                                                      tidattachment(nmg_msgBody.MessageParts.Items[nmm_index]).SaveToFile(nmm_strAttachFilePath);  
                                                      except  
                                                      continue;  
                                                      end;  
                                                      nmg_stsAttach.add('<a   href="'+   nmm_strAttachFileUrl+'"   target=_blank>   '+nmm_strAttachFileName+'</a><BR><br>');  
                                                      nmg_blnHasAttOut   :=   true   ;  
                                                end  
                                          else  
                                                begin  
                                                      nmm_strAttachFilePath   :=   nmm_strDirName+'\Image\'+inttostr(nmm_index);  
                                                      nmm_strAttachFileUrl   :=   nmm_strAttachFileUrl+'\Image\'+inttostr(nmm_index)+'\'+nmm_strAttachFileName;  
                                                      ForceDirectories(nmm_strAttachFilePath);  
                                                      nmm_strAttachFilePath   :=   nmm_strAttachFilePath+'\'+nmm_strAttachFileName;  
                                                      try  
                                                      if   not   fileexists(nmm_strAttachFilePath)   then  
                                                      tidattachment(nmg_msgBody.MessageParts.Items[nmm_index]).SaveToFile(nmm_strAttachFilePath);  
                                                      except  
                                                      continue;  
                                                      end;  
                                                      //*************************替换图片src****************  
                                                      nmg_Reg.Expression   :='src\s*=\s*"?[^\s]*@[^\s]*"?';  
                                                      nmm_strbody   :=nmg_stsContent.text;  
                                                      if   nmg_reg.Exec(nmm_strbody)   then  
                                                            begin  
                                                                nmm_strbody:=StringReplace(nmm_strbody,nmg_reg.Match[0],  
                                                                                        'src='+nmm_strAttachFileUrl,[rfReplaceAll,   rfIgnoreCase]);  
                                                                nmg_stsContent.Text   :=   nmm_strbody;  
                                                            end;  
                                                      //****************************************************  
                                                end;  
                                  end;  
                  end;  
          if   nmg_blnHasAttOut   =true   then   FinishAttachHtm(nmm_strDirName+'\mailatt.htm');  
          FinishContentHtm(nmm_strDirName+'\mailcont.htm');  
          //******************************收取完成************************************  
          nmg_reRunTimeErr:=reSuccess;  
          nmg_arrAllErrString[Ord(reGetReceiveErr)]   :=   '收取指定邮件成功.';  
  except  
          ON   E:Exception   do  
          begin  
                Result   :=   '';  
                nmg_reRunTimeErr:=reGetReceiveErr;  
                nmg_arrAllErrString[Ord(nmg_reRunTimeErr)]   :=   E.Message;  
          end;  
  end;  
      Result   :=   nmg_reRunTimeErr;  
  end;  
 

多谢高手,我先研究一下,稍后给分

to:zuoansuifeng,你代码中的以下几个函数的代码能再给一下啊。  
  FormAttachHtm,DecodeHeader,FinishAttachHtm,FinishContentHtm,nmg_stsAttach  
  先谢了

zuoansuifeng好人

我自己已经搞定了    
  不过还是谢谢     zuoansuifeng(左岸)  
   
  散分结贴了

posted @ 2008-10-28 09:56 delphi2007 阅读(128) | 评论 (0)编辑 收藏

渴求PC to Phone的问题解决 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215090951124.html
因工作需要,需要完成PC   to   Phone的网络电话功能,但本人从来未涉及过相关知识,请问如何解决,最好提供相关例子或源代码,感激不尽!  
   
  电子信箱:panpdh@163.com

找老外的资料研究下  
   
  http://search.techrepublic.com.com/search/pc-to-phone.html?&c=1&s=0&m=20&o=0&i=0&t=0

posted @ 2008-10-28 09:56 delphi2007 阅读(92) | 评论 (0)编辑 收藏

關於網域的三個典型問題 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061215073118125.html
問題1:怎麼樣判斷我當前是登陸的網域還是登陸的本機?  
   
  問題2:判斷完第一問之後,如果是用本機賬號登陸的。那麼就會提示輸入網域名,用戶名,和密碼。那麼怎麼樣調出系統里面登陸網域要輸入用戶名和密碼的那個對話框呢?調出來後,我輸入的用戶名和密碼,它會自動去和服務器里的對比嗎?  
   
  問題3:如果我自己做一個登陸窗,然後怎麼樣去和服務器里對比用戶名和密碼?  
   
  以上三個問題謝謝大家,多給意見!  
  如果方便的話,請發Mail:Marking.ma@Coretronic.com  
  在5分鐘之內。我肯定會給您答復的!

关注中...

自己頂起來吧!

我再顶...

我繼續頂。。。

posted @ 2008-10-28 09:56 delphi2007 阅读(105) | 评论 (0)编辑 收藏

TIDSMTP发送邮件时的奇怪提示! Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061214202002126.html
我用Indy的TIDSMTP和TIDMessage发送电子邮件,但是出现了bad   secquence   of   command错误!我的代码是这样的:  
  procedure   TfrmEmail.SpeedButton7Click(Sender:   TObject);  
  var   Msg:   TIDMessage;  
  begin  
          Msg:=TIDMessage.Create(SMTP);  
          Msg.Clear;  
          Msg.Subject:=edtSubject.Text;     //subject   主题  
          Msg.Body.Assign(memoBody.Lines);   //body   内容  
          Msg.From.Text:=Trim(edtFrom.Text);     //寄件人  
          Msg.Recipients.EMailAddresses:=Trim(edtMailto.Text);   //收信人  
          SMTP.Host:='smtp.163.com';  
          SMTP.AuthenticationType:=atLogin;  
          SMTP.Username:='xaguobo';  
          SMTP.Password:='*******'     ;//这里我输入的是我的163邮箱的登陆密码  
          SMTP.Port:=25;  
          try  
              SMTP.Connect(-1);   //   我跟踪连接服务器成功  
              try  
                  SMTP.Send(Msg);  
                  ShowMessage('邮件已发送');  
              finally  
                  SMTP.Disconnect;  
              end;  
      except  
          on   e:   exception   do  
              ShowMessage('Mail   寄送失敗:'   +   e.Message);  
   
      end;  
   
  end;  
   
  请个位大虾指教!  
   
 
posted @ 2008-10-28 09:56 delphi2007 阅读(686) | 评论 (2)编辑 收藏

Indy10发送与接收问题(记录) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061214163900127.html
我使用TIDTcpClient及TIdTcpServer,  
  使用ReadLn及WriteLn正常.  
  但是我想发送记录类型,如何做呢?我的实现如下,但没有成功:  
  ------------------------------------------------------------  
  type  
      TUser=record  
          UserName,UserID:String;  
          IP:String;  
          Port:Integer;  
          Msg:String;  
          Arr:Array[1..9]   of   shortString;  
          flag:Boolean;  
          Cmd:String;  
      end;  
  ------------------------------------------------------------  
  实现如下:  
  ------------------------------------------------------------  
  1.使用TidBytes类型:  
  客户:  
    procedure   TForm1.Button3Click(Sender:   TObject);  
  var  
    User:TUser;  
    sby:TidBytes;  
  begin  
    with   user   do  
    begin  
        UserName:='Wyatt';  
        UserID:='7895421';  
        Ip:='192.168.1.188';  
        Port:=9999;  
        Msg:=Edit3.Text;  
        cmd:='Quit';  
    end;  
      sBy:=RawTOBytes(user,sizeof(user));  
      ic1.IOHandler.Write(sBy);  
  end;  
  服务器:  
  procedure   TFrmServer.is1Execute(AContext:   TIdContext);  
  var  
  user:TUser;  
  buf:TidBytes;  
  begin  
    Acontext.Connection.IOHandler.ReadBytes(buf,sizeof(user));  
    BytesToRaw(buf,user,sizeof(user));  
    with   user,memo1.Lines     do  
    begin  
      Add(userName);  
      add(userID);  
      add(ip);  
      add(inttostr(port));  
    end;  
  end;  
  ----------------------------------------------------------------  
  2.使用TStream方法:  
    客户:  
      procedure   TForm1.Button3Click(Sender:   TObject);  
  var  
    User:TUser;  
    Mon:TMemoryStream;  
  begin  
    with   user   do  
    begin  
        UserName:='Wyatt';  
        UserID:='85171659';  
        Ip:='192.168.1.188';  
        Port:=9999;  
        Msg:=Edit3.Text;  
        cmd:='Quit';  
    end;  
    Mon:=TMemoryStream.Create;  
    try  
      Mon.WriteBuffer(user,sizeof(user));  
      ic1.IOHandler.Write(Mon);  
    finally  
      Mon.Free;  
    end;  
  end;  
  服务器:  
    procedure   TFrmServer.is1Execute(AContext:   TIdContext);  
  var  
  user:TUser;  
  Mon:TMemoryStream;  
  begin  
  Mon:=TMemoryStream.Create;  
  try  
      AContext.Connection.IOHandler.ReadStream(Mon);  
      Mon.ReadBuffer(user,Sizeof(user));  
      with   user,memo1.Lines     do  
    begin  
      Add(userName);  
      add(userID);  
      add(ip);  
      add(inttostr(port));  
    end;  
  finally  
      Mon.Free;  
  end;  
  end;  
  以上都不能实现,请高手帮忙解决一下.  
  以上是在delphi2006  
   
  注意一定要Indy10,因为和Indy9不同  
  其中要注意Use   IdContext,IdGlobal这两个单元  
   
 

一个想法    
  先接收成byte   array   然后使用   copyMemory转换

type  
      TUser=record  
          UserName,UserID:String;  
          IP:String;  
          Port:Integer;  
          Msg:String;  
          Arr:Array[1..9]   of   shortString;  
          flag:Boolean;  
          Cmd:String;  
      end;  
  这样定义是有问题的,里面的String会导致包大小计算不对

楼上分析准确,就是这个原因

在Record内不要使用String类型,就算要用,也要用String[254]这种或Array   of   Char

呵,谢谢  
  我改动一个,  
  type  
      TUser=record  
          UserName,UserID:String[20];  
          IP:String[16];  
          Port:Integer;  
          Msg:String[100];  
          Arr:Array[1..9]   of   String[20];  
          flag:Boolean;  
          Cmd:String[20];  
      end;  
  ------------------------  
  使用RawtoBytes及BytesToRaw可以。  
  为何使用Stream收不到呢?  
  另,如果要传送像文件类似的东西,如何定义呢?

自己定义应用协议,数据格式,传输规范  
  例如FTP,HTTP等都是TCP的应用协议

再求,为何使用Stream收不到呢?

posted @ 2008-10-28 09:56 delphi2007 阅读(923) | 评论 (0)编辑 收藏

怎样从网上每天定时取新闻放到本地? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061214154538128.html
怎样从网上每天定时取新闻放到本地?  
  例如:http://www.ah.xinhuanet.com/  
  每天早上9点定时把中间的10条新闻取下来存入数据库?  
  第一次做这样的工作有点摸不清头绪!

没有人?在线等待

UP   估计   有人说     分析   页码

1、下载新闻首页到本地  
  2、使用bsalas   EmbeddedWB进行分析  
  3、分析得到最新的新闻  
  4、我自己做了一个自动检查sports.tom.com/nba的新闻,只要有关火箭的新闻,我没看过的自动下载到本地,提示我。可设置多少分钟刷新。

网站要做RSS聚合

1.   用XMLHTTP,   打开新闻网站首页  
  2.   根据网站特点,   找到面页中新闻的链接页面  
  3.   再用XMLHTTP下载页面,   解析页面内容保存到本地  
   
  网站的特点,   及新闻页面的解析方式最好记录在文本文件件中,   比如用正则表达式,   以适应网站的调整

posted @ 2008-10-28 09:56 delphi2007 阅读(445) | 评论 (1)编辑 收藏

请教 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061214144328129.html
Tag60190=record        
          CmdID:Word;          
          bOnline:boolean;          
          end;    
  我有一个这样的结构体,服务器返回给我一个这样的结构体.服务器的代码是C++,但服务器返回的时候,把bOnline付值为1或者零我用TcpClient.ReadBuffer(TagRoleonlineback,sizeof(TagRoleonlineback));接收服务器返回给我的结构体   .  
  当我接收完了之后,我怎么写条件判断语句呢?比如:if   byte(TagRoleonlineback.bOnline)=1   then这样写不对啊    
  该怎么写这个判断语句    
   
 

直接用就行了  
  if   TagRoleonlineback.bOnline   then

大哥,这样不行啊.我写了,不行啊,如果我要写个MESSAGEBOX弹出一个对话框,来看TagRoleonlineback.bOnline   这个值,该怎么写呢?

注意下   Boolean   delphi   中相当于   Integer   的长度,   另外还有   WordBool(2byte),   ByteBool

ShowMessage(BoolToStr(TagRoleonlineback.bOnline))

我也是这样写的呀,但对话框显示为空,是不是我服务器发过来的消息我没有接收到呢??TcpClient.ReadBuffer(TagRoleonlineback,sizeof(TagRoleonlineback));也就是说,这句没有接收服务器发过来的消息

对了,我这个boolean必须为一个字节

Tag60190=record        
          CmdID:Word;          
          bOnline:boolean;          
          end;    
  这个结构及其内部元素的字节长度,以及内部元素的排序顺序要与C语言的一致。  
  且要注意是否紧密排列的影响

目前结构是一致的,我不知道DELPHI里boolean是多少字节,C++那边传过来的是一个字节.我不玩DELPHI,但这个项目要用DELPHI,各位大哥帮帮忙啊

你这样声明结构试试  
  Tag60190=packed   record  
          CmdID:Word;  
          bOnline:boolean;  
          end;

目前需求是这样的,我先向服务器发一条消息(验证身份),然后服务器会反馈一条消息给我,我根据服务器反馈给我的消息,如果验证通过,就再发一条消息给服务器.如此而已,请问我该怎么写???

var  
  stredit2:string;  
  stredit3:string;  
  stredit1:string;  
  begin  
  if   TcpClient.Connected   =true   then  
          TcpClient.Disconnect;  
          try  
          begin  
          TcpClient.Host   :=Edit5.Text;   //   连接服务器的IP跟端口  
          Tcpclient.Port   :=StrtoInt(Edit6.Text);  
        with   TcpClient   do  
        begin  
            try  
                  Connect(3000);  
              except  
                TcpClient.Host   :='';  
                  tcpclient.Port   :=0;  
                Application.MessageBox(pChar('踢人-->登陆失败!'),pChar('错误'),MB_OK+MB_ICONINFORMATION);  
            end;  
          end;  
        Application.MessageBox(pChar('连接远程主机成功'),pChar('踢人'),MB_OK+MB_ICONINFORMATION);  
          TagCheck.CmdID   :=60001;  
          TagCheck.wSize   :=sizeof(TagCheck);  
          TagCheck.dwSerial   :=1000000000;  
          TagCheck.szGmAccountName   :='SuperGm';  
          TagCheck.szGmPassword   :='kungfu';  
            TagRole.CmdID   :=   60175;  
            TagRole.wSize   :=sizeof(TagRole);  
            TagRole.dwSerial   :=1000000000;  
            stredit2   :=Edit2.Text;  
            stredit3   :=Edit3.Text;  
            stredit1:=Edit1.Text;  
            TagRole.dwBorough   :=Crc(pchar(stredit2));  
            TagRole.dwWorldNameCrc   :=Crc(pchar(stredit3));  
            FillChar(TagRole.szRoleName,SizeOf(TagRole.szRoleName),#0);  
            Assert(Length(stredit1)<=SizeOf(TagRole.szRoleName));  
            Move(PChar(stredit1)^,TagRole.szRoleName[0],Length(stredit1));  
            TagRoleonline.CmdID   :=60185;  
            TagRoleonline.wSize   :=sizeof(TagRole);  
            TagRoleonline.dwSerial   :=1000000000;  
            TagRoleonline.dwBorough   :=Crc(pchar(stredit2));  
            TagRoleonline.dwWorldNameCrc   :=Crc(pchar(stredit3));  
            stredit1   :=Edit1.text;  
            FillChar(TagRoleonline.szRoleName,SizeOf(TagRoleonline.szRoleName),#0);  
            Assert(Length(stredit1)<=SizeOf(TagRoleonline.szRoleName));  
            Move(PChar(stredit1)^,TagRoleonline.szRoleName[0],Length(stredit1));  
            isize:=sizeof(TagCheck);  
            TcpClient.WriteBuffer(isize,sizeof(DWORD),true);//向服务器发出验证用户名跟密码的指令  
            TcpClient.WriteBuffer(TagCheck,sizeof(TagCheck),true);//向服务器发出验证用户名跟密码的指令  
            sleep(3000);  
            TcpClient.ReadBuffer(TagCheckback,sizeof(TagCheckback));//接受服务器返回的指令,验证是否通过  
            Application.MessageBox(pchar(inttostr(TagCheckback.CmdID)),pChar('角色验证ID'),MB_OK);  
            if   TagCheckback.dwErrorCode=0   then  
            begin  
              isize   :=sizeof(TagRoleonline);  
              TcpClient.WriteBuffer(isize,sizeof(DWORD),true);//向服务器发出查询这个角色是否在线的指令  
              TcpClient.WriteBuffer(TagRoleonline,sizeof(TagRoleonline),true);//向服务器发出查询这个角色是否在线的指令  
              sleep(3000);  
              TcpClient.ReadBuffer(TagRoleonlineback,sizeof(TagRoleonlineback));//接受服务器返回的指令,角色是否在线  
              Application.MessageBox(pchar(inttostr(TagRoleonlineback.CmdID)),pChar('角色是否在线ID'),MB_OK);  
              if   TagRoleonlineback.bOnline   then  
              begin  
                      Application.MessageBox(pchar('说明已经接收到服务器发给我的角色是否在线的消息'),pChar('角色是否在线'),MB_OK);  
                    isize   :=sizeof(TagRole);  
                    TcpClient.WriteBuffer(isize,sizeof(DWORD),true);   //向服务器发出踢角色下线的指令  
                    TcpClient.WriteBuffer(TagRole,sizeof(TagRole),true);   //向服务器发出踢角色下线的指令  
                    sleep(3000);  
                    TcpClient.ReadBuffer(TagRoleback,sizeof(TagRoleback));//接受服务器返回的指令,踢角色下线是否成功  
                    if     TagRoleback.dwErrorCode=0   then  
                        Application.MessageBox(pChar('该角色已被成功踢下线,请继续其它操作!'),pChar('踢人'),MB_OK+MB_ICONINFORMATION)  
                    else  
                        Application.MessageBox(pChar('该角色没有被成功踢下线,请继续其它操作!'),pChar('踢人'),MB_OK+MB_ICONINFORMATION);  
                end;  
              end;  
                TcpClient.Disconnect;  
              end;  
              except       on   e:exception   do  
              begin  
              Application.MessageBox(pChar(e.message),pChar('踢人'),MB_OK+MB_ICONINFORMATION);  
            TcpClient.Disconnect;  
            end;  
    end;  
  end;

大家帮忙看一下,看这段测试代码哪里不对,是不是要用线程,我如果开启线程的话,该怎么做呢??

posted @ 2008-10-28 09:56 delphi2007 阅读(149) | 评论 (0)编辑 收藏

用程序登录服务器!急急 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061214110418130.html
在服务器上已创建相应的用户名和用户密码,这些都是已知的.  
  现我想用DELPHI程序实现登录指定的计算机.  
  在这儿有两种情况  
  一种是域方式登录.  
  一种是网络组方式登录.  
  请写出相应的源码.  
 

路过一下

你要完全用delphi实现有一点难度,而且也慢,  
  方法:  
  1.你可以先启动windows本身自带的远程登录功能  
  2.再通过delphi自动输入用户密码到远程登录窗口,登录即可.

具体怎么实现呀。

请yi10000写出相关实现的代码,多谢

posted @ 2008-10-28 09:56 delphi2007 阅读(138) | 评论 (0)编辑 收藏

如何批量获得所连接的客户机的IP地址? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061218103349101.html
在一个C/S模式的Delphi程序中,  
  客户端有一个通信托盘,用indy组件板中的idtcpclient控件。  
  服务器端用indy组件板中的idtcpserver控件,并用一个dbGrid组件,用于显示所连接的客户机的IP地址及机器名。  
  问题是:如何获得所连接的客户机的IP地址并显示出来?请高手帮下,谢谢  
  由于我是个新手,没有分给大家了,还请大家海涵。。。  
 

up

try  
          with   idtcpserver.LockList   do  
          for   i:=0   to   Count-1   do  
              TIdPeerThread(Items[i]).Connection.Socket.Binding.PeerIP  
        finally  
              idtcpserver.UnlockList;  
        end;

非常感谢。

posted @ 2008-10-28 09:56 delphi2007 阅读(280) | 评论 (0)编辑 收藏

DELPHI截取网络数据包 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061218101640102.html
用Delphi和wincap包中PacketReceivePacket函数接包时出现内存泄漏。  
  这是扫描什么原因?  
  var  
  recvbuf:   array[0..1024*250   -   1]   of   char;  
   
  if   not   PacketSetBuff(lpAdapter,250*1024)   then  
  begin  
          ShowMessage(Format('PacketSetBuff   Error:   %d',[GetLastError()]));  
  exit;  
  end;  
   
  if   not   PacketSetReadTimeout(lpAdapter,1)   then  
  ShowMessage('Warning:   Unable   to   set   the   timeout');  
   
      lppacketr   :=   PacketAllocatePacket();  
  if   lppacketr   =   nil   then  
  begin  
  ShowMessage(Format('PacketAllocatePacket   receive   Error:   %d',[GetLastError()]));  
  exit;  
  end;  
   
  PacketInitPacket(lppacketr,@recvbuf,sizeof(recvbuf));  
   
  while   true   do  
  begin  
                        if   not   PacketReceivePacket(lpAdapter,lppacketr,true)   then   exit;  
                    end;    
 

用Delphi和wincap包中PacketReceivePacket函数接包时出现内存泄漏。  
  这是什么原因?  
 

posted @ 2008-10-28 09:56 delphi2007 阅读(720) | 评论 (0)编辑 收藏

求像数据集一样循环遍历XML的方法 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061218092101103.html
<?xml   version="1.0"   encoding="GB2312"?>  
  <w   st="1">  
      <w1   c1="0"   c2=""   c3="0"   c4=""   c5="0"   c6=""   c7="0"   c8=""   c9="4.843011"   c10="21.00"   c11="0"   c12=""   c13="0"   c14=""   c15="0"   c16=""   h="费耶诺德"   a="海牙"   gt="2006-12-10   19:30"   gn="荷甲"   st="4"/>  
      <w2   c1="0"   c2=""   c3="0"   c4=""   c5="0"   c6=""   c7="0"   c8=""   c9="5.451286"   c10="18.00"   c11="0"   c12=""   c13="0"   c14=""   c15="0"   c16=""   h="阿贾克斯"   a="阿尔克马尔"   gt="2006-12-10   19:30"   gn="荷甲"   st="4"/>  
      <w3   c1="0"   c2=""   c3="0"   c4=""   c5="3.571144"   c6="28.00"   c7="0"   c8=""   c9="0"   c10=""   c11="0"   c12=""   c13="0"   c14=""   c15="0"   c16=""   h="杜伊斯堡"   a="  
  </w>  
   
   
   
  var  
      Clinic:   IXMLNode;  
  begin  
  XMLDocument1.Active   :=   true;  
   
  ????  
      Clinic   :=   XMLDocument1.DocumentElement.ChildNodes[0].;  
      caption   :=   Clinic.AttributeNodes.Nodes['c1'].Text;  
  ????  
  end;  
   
 

这样的能行吗

var  
      var  
      Node,childNode:IXMLNode;  
      xmlDoc:IXMLDocument;  
      i:integer;  
       
  begin  
      CoInitialize(nil);  
      xmlDoc   :=   NewXMLDocument   ;  
        xmlDoc.Active:=true;  
        xmlDoc.loadFromXML(YourXMLString);  
        Node:=xmlDoc.ChildNodes.FindNode('w');  
        for   i:=0   to   Node.ChildNodes.Count-1   do    
  begin    
        childnode:=Node.ChildNodes[i];  
        //do   your   work  
   
  end;  
      XMLDoc   :=   nil;  
      CoUninitialize();  
  end;

其实就跟你treeview加载进去的树型结构是一样的道理啊    
  AddChild   加节点   Attributes加节点的属性

列如把listview的ITEM加载进去成XML的函数  
  function   GetxmlNode:   string;  
  var  
      nmm_ss:   string;  
      nmm_inti:   Integer;  
      nmm_xmldoc:   TXMLDocument;  
      root:   IXMLNode;  
      nmm_xmlnode:   IXMLNode;  
  begin  
      nmm_xmldoc   :=   TXMLDocument.Create(Self);  
      nmm_xmldoc.LoadFromFile(nmg_strpath   +   'UpdateFree.xml');  
      root   :=   nmm_xmldoc.DocumentElement;  
      root   :=   root.ChildNodes.First;  
      root.ChildNodes.Clear;  
      for   nmm_inti   :=   0   to   ListView1.Items.Count   -   1   do  
      begin  
          nmm_xmlnode   :=   root.AddChild('file');  
          nmm_xmlnode.Attributes['name']   :=   ListView1.Items[nmm_inti].SubItems.Strings[0];  
          nmm_xmlnode.Attributes['version']   :=   ListView1.Items[nmm_inti].SubItems.Strings[1];  
          nmm_xmlnode.Attributes['dest']   :=   ListView1.Items[nmm_inti].SubItems.Strings[2];  
          nmm_xmlnode.Attributes['time']   :=   ListView1.Items[nmm_inti].SubItems.Strings[3];  
      end;  
      nmm_xmldoc.SaveToFile(nmg_strpath   +   'UpdateFree.xml');  
      nmm_xmldoc.Free;  
  end;

posted @ 2008-10-28 09:56 delphi2007 阅读(318) | 评论 (0)编辑 收藏

请问大家:TCompressStream()的压缩比有多少? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061217223356104.html
请问大家:TCompressStream()的压缩比有多少?

看压什么东西了,压缩率跟工具关系不大  
  像文本的压缩率就很高,而视频就基本压缩不了

想压缩 远程控制抓到的图象   
 

有没有好的压缩算法........

前后两张图Xor后再压缩,用自带的那个就可以了

to   aoeiuvcom(密码-铅笔)   :  
  自带的指哪个?谢谢

用TCompressStream()压缩后的图片模糊到极点。  
   
  如果用算法的话那速度肯定跟不上~   画面不流畅。  
   
  最好是用陈经淘先生的代码,但要钱买~  
   
  如果不是商业软件的话,那就干脆别做了。

zlib   :   ZLibEx.pas

好像就是你说的这个:)

找到了 TCompressStream()的压缩比为60%左右

posted @ 2008-10-28 09:56 delphi2007 阅读(165) | 评论 (0)编辑 收藏

请问一下 我怎么判断对方发送的是文本 还是文件呢 Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061217223032105.html
请问一下 我怎么判断对方发送的是文本 还是文件呢 听他们说通过 判断对方发送过来的"标记字",可是我怎么也实现不了........有源代码更好 谢谢.......

问题不清楚

文件不可能通过SendText发送。OVER

汗一个,lz没说清楚,用什么东西传的啊?

一般是定义成Record,这里面会一个域用来表示标识的,可以根据它来判断是什么类型

一般做系统都要自己定义一套协议,不同的类型用个字段来标识,  
  很多时候我们定义的包是可以另外定义一个包头的,包头里面就放一些最基本的信息,公用的  
  后面再跟对应的具体数据,接收的时候先分析一下包头,再处理就行了,这样不会乱

posted @ 2008-10-28 09:56 delphi2007 阅读(413) | 评论 (0)编辑 收藏

求delphi下winpcap编程资料(SOS) Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061217191608106.html
谁有Ndis_def.pas  
  我找到了其他几个winpcap   for   delphi单元文件  
  winpcap.pas  
  packet32.pas  
  bpf.pas  
  少一个Ndis_def.pas

up

http://www.cublog.cn/u/8780/showart.php?id=174273   WinPcap   教程

老兄,能否将你的那三个文件(winpcap.pas,packet32.pas,bpf.pas))发我一份,我也很有兴趣,先谢谢了!  
  我的邮件:mail@net9999.com  
   
 

posted @ 2008-10-28 09:56 delphi2007 阅读(283) | 评论 (0)编辑 收藏

传送一个文件夹下的所有文件给客户端,每个文件不大于200K,求最好方法? Delphi / Windows SDK/API
http://www.delphi2007.net/DelphiNetwork/html/delphi_20061217181039107.html
首先得到一个文件夹下的所有文件名称列表,循环发送给客户端,每发送完一个不断开连接。请问有什么高效的方法没有?

自己定义一个数据包就可以了啊  
  比方说   包长度,文件名,文件内容  
  客户端收到后回复个结果  
  这样一直发就可以了啊

你在问别人,怎样写一个软件。  
   
  不是三言两语能解决问题的。

我认为你个问题,问的还不够准确:  
  下面是从服务端和客户端角度来考虑这个问题的,请参考一下:  
   
  server:    
  一、在并发处理上做好一点,有必要的话可以采用完成端口,如果觉得麻烦可以选择异步消息或事件模式;二、支持像IIS的Content-Length/Rang模式的数据获取(如果只为了满足200K的文件的需求,这个功能可以不考虑);  
   
  client:  
  一、多线程很有必要,像Flashget,讯雷这样的多线程下载工具。及一个文件列表下来,可以将列表中的文件分配给不同的线程,以进行下载。视情况而定线程数也不要太多。可以参考Flashget等软件的线程数!  
   
  另外就是流压缩机制可以找些文章来参考一下!  
 

posted @ 2008-10-28 09:56 delphi2007 阅读(160) | 评论 (0)编辑 收藏

仅列出标题
共34页: First 23 24 25 26 27 28 29 30 31 Last