delphi编写winsocket的流程
1、在窗体创建的时候启用动态连接库(引用winsock)
   var  aWSAData:TWSAData;
   if WSAStartup($0101,aWSAData)<>0 then
  begin
    MessageBox(Handle,'不能启动winsock动态链接库!','错误',MB_OK);
    Exit;
  end;
2、然后启动监听线程
 Lthread:=TListenthread.CreateIt(9002);
3、线程的构造函数
 constructor CreateIt(port:integer); //创建线程端口//监听线程的构造方法
constructor TlistenThread.CreateIt(port:integer); //创建端口
begin
  inherited create(true);
  lisport:=port;
  FreeOnTerminate:=true;
  resume; //******唤醒线程  重(新)开(始),再继续;恢复;收回;【微软】继续执行 挂起的线程重新执行。
end;
4、线程的销毁函数
destructor  destroy;override;  //结束线程
destructor TlistenThread.destroy;
begin
  if lissocket<>INVALID_SOCKET then
  begin
    //shutdown(lissocket,SD_BOTH);//中断连接,其实连接还存在。
    closesocket(lissocket);   //*********CloseSocket() 是用来关闭一个 Socket 的!
    DebugMessage('Close Socket');
  end;
  inherited destroy;
end;
5、线程的execute方法
procedure Execute; override;  //线程执行过程
procedure TlistenThread.Execute;
var   acceptsocket:Tsocket;
      sa:SOCKADDR_IN;
      salen:integer;
      tempthreadread:ThreadSocketRead;
begin
  { Place thread code here }
  Lissocket:=socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
  //***********************************************************************************
  {socket()系统调用,带有三个参数:
    1、参数domain指明通信域,如PF_UNIX(unix域),PF_INET(IPv4),
      PF_INET6(IPv6)等
    2、type指明通信类型,最常用的如SOCK_STREAM(面向连接可靠方式,
      比如TCP)、SOCK_DGRAM(非面向连接的非可靠方式,比如UDP)等。
    3、参数protocol指定需要使用的协议。虽然可以对同一个协议
      家族(protocol family)(或者说通信域(domain))指定不同的协议
      参数,但是通常只有一个。对于TCP参数可指定为IPPROTO_TCP,对于
      UDP可以用IPPROTO_UDP。你不必显式制定这个参数,使用0则根据前
      两个参数使用默认的协议。}
  //******************************************************************************
  if lissocket=INVALID_SOCKET then
  begin
    DebugMessage('Create Socket Error');
    exit;
  end;
  DebugMessage('Create Socket!');  //调用本单元的 DebugMessage方法   显示成功创建套接字
  sa.sin_family:=PF_INET;
  sa.sin_port:=htons(lisport);
  sa.sin_addr.S_addr:=INADDR_ANY;//---------dcc-----htonl(INADDR_ANY);  //INADDR_ANY,表示本地计算机的默认IP地址
  salen:=sizeof(sa);
  //******************************************************************************
    { sin_family指代协议族,在socket编程中只能是AF_INET ,PF_INET
      sin_port存储端口号(使用网络字节顺序)
      sin_addr存储IP地址,使用in_addr这个数据结构
      s_addr按照网络字节顺序存储IP地址
      sin_zero是为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节。
    }
   { int bind ( SOCKET s , const struct sockaddr FAR *addr , int namelen );
    [参数]
    s - 指向用Socket函数生成的Socket Descrīptor
    addr - 指向Socket地址的指针
    namelen - 该地址的长度.
    [返回值]
    当函数成功调用时返回0
    调用失败时返回 SOCKET_ERROR
      }
  //***********************************************************************************
  if bind(lissocket,sa,sizeof(sa))=SOCKET_ERROR then
  begin
    closesocket(lissocket);
    DebugMessage('无法打开端口:'+inttostr(lisport));
    exit;
  end;
  DebugMessage('listen on port:'+inttostr(lisport)); //调用本单元的 DebugMessage方法    显示连接的端口号
  listen(lissocket,200);
    //**********************************************
     {socket 套接字,网络编程必用的
      listen ()监听从服务器传来的接收数据
      listen ()创建一个套接口并监听申请的连接.}
    //*******************************************
  while not terminated do
  begin
    acceptsocket:=accept(lissocket,@sa,@salen); //AcceptSocket 是一个阻塞方法,它返回可用来发送和接收数据的 Socket。
    DebugMessage('连接成功!');
    if acceptsocket=INVALID_SOCKET then
    begin
      DebugMessage('接受Socket失败!');
      continue;
    end;
    //调用 UnitSocketRead 方法块中的 ThreadSocketRead.CreateIt 方法 并且同时调用datamoudle的数据库连接控件的连接语句。
    tempthreadread:=ThreadSocketRead.CreateIt(acceptsocket,Datamodule1.ADOConnection1.ConnectionString);
    if tempthreadread<>nil then
    begin
      str:='New thread:'+IntToStr(tempthreadread.threadid);
      synchronize(AddMes);                    //synchronize 时间同步   调用方法本模块的 AddMes方法
    end
    else
    begin
      closesocket(acceptsocket);
      DebugMessage('创建执行线程失败!');   //调用本单元的 DebugMessage方法
    end;
  end;
  closesocket(lissocket);  //一个关闭套接口的方法
end;
 6、实现多线程类
  6.1、类的构造函数
     //类的构造函数
    constructor ThreadSocketRead.CreateIt(S:TSocket;Con:string);
    begin
      CoInitialize( nil ); //使用com对象必须要初始化 主要做Com相关资源的释放,清理  工作...
      inherited Create(true);//继承tthread线程类的构造方法。
  FreeOnTerminate:=True;    //用于结束线程,设置FreeOnTerminate为True ,执行完成线程以后,你不想明确摧毁它。当FreeOnTerminate是假的,线程对象必须明确销毁应用程序代码。
  peerSocket:=S;
  FCon:=con;
  debugList:=Tstringlist.create;
  Suspended:=false;//线程类的一个属性 tthread property Suspended: Boolean read FSuspended write SetSuspended;
end;
  6.2、//定义销毁类方法还没有写完.
destructor ThreadSocketRead.destroy;
begin
  if peerSocket<>INVALID_SOCKET then  closesocket(peerSocket);
  Synchronize(removelist);
  BCSample.Free;
  if FAdoQuery<>nil then FAdoQuery.Free;
  if (Fadoconnection<>nil)then
  begin
     if Fadoconnection.Connected  then  Fadoconnection.Close ;
     Fadoconnection.Free;
  end;
  debugList.Free;
  CoUnInitialize;  //必须使用 主要做Com相关资源的释放,清理工作...
  inherited destroy;
end;
6.3、多线程类的执行
procedure ThreadSocketRead.Execute;
var
  btime:string;
  size:integer;
  timedif,blong1,ErrCode:integer;   //timedif 时差   ErrCode 错误编码, blong1 程序执行时间。
  label endp;
  procedure Writelog;
  begin
     debugList.SaveToFile(BCSample.DebugFileName);
     debugList.clear;
     blong1:=Round((now-strtodatetime(btime))*SecsPerDay);
     Fadoconnection.BeginTrans;
     with Fadoquery do
     begin
       try
         close;
         sql.clear;
         sql.Add('insert into T_FC_CallbackLog (FC_JCPointNo,FC_CBackTime,FC_CBackState,FC_Duration,FC_DataSize,TimeDiff)');
         sql.add('values (:jcno,:btime,:state,:blong,:datasize,:timedif)');
         Parameters.ParamByName('jcno').Value := BCSample.PointNo;
         Parameters.ParamByName('btime').Value := btime;
         Parameters.ParamByName('state').Value := Errcode;
         Parameters.ParamByName('blong').Value := blong1;
         Parameters.ParamByName('dataSize').Value := BCSample.DataSize;
         Parameters.ParamByName('timedif').Value := timedif;
         ExecSql;
         Fadoconnection.CommitTrans;
        Except
          on e:Exception do Fadoconnection.RollbackTrans;
       end;
     end;
   end;
  //将设置ip失败的调查仪信息插入到数据库中
   procedure WriteSetDeviceIPLog;
   begin
     blong1:=Round((now-strtodatetime(btime))*SecsPerDay);
     with Fadoquery do
     begin
       try
         close;
         sql.clear;
         sql.Add('insert into T_FC_SetDeviceIPLog (JCPointNO,TesterNO,CallbackTime,CallbackState,Duration)');
         sql.add('values (:JCPointNO,:TesterNO,:btime,:state,:blong)');
         Parameters.ParamByName('JCPointNO').Value := BCSample.PointNO;
         Parameters.ParamByName('TesterNO').Value := BCSample.DeviceNO;
         Parameters.ParamByName('btime').Value := btime;
         Parameters.ParamByName('state').Value := Errcode;
         Parameters.ParamByName('blong').Value := blong1;
         ExecSql;
        Except
          on e:Exception do exit;
       end;
     end;
   end;
begin
  //这里面紧接着要写对数据包的处理。
  btime:=datetimetostr(now);
  if PeerSocket=INVALID_SOCKET then exit;
  size:=SizeOf(SockAddrIn); //初始化。
  getpeername(PeerSocket,SockAddrIn,size);   //取得对等方的连接。
  PeerIP:=inet_ntoa(SockAddrIn.sin_addr); //inet_ntoa()将网络地址转换成'.'点隔的字符串格式。
  PeerPort:=ntohs(SockAddrIn.sin_port);   //ntohs()将一个无符号短整形数从网络字节顺序转换为主机字节顺序。
  DebugMessage('连接的ip:'+PeerIP+':'+'端口号'+inttostr(PeerPort));//把连接的信息打印出来
  Synchronize(AddTolist);
  //建立数据库的连接。
  try
    Fadoconnection:= Tadoconnection.Create(nil);  //创建数据库连接控件。
    Fadoconnection.ConnectionString:=FCon;        //把连接数据库的字符串赋值。
    Fadoconnection.LoginPrompt:=false;
    Fadoconnection.KeepConnection:=true;
    Fadoconnection.Connected:=true;
  except
    on e:EOleException do
    begin
      DebugMessage('数据库的连接出现问题 :'+e.message);
      exit;
    end;
  end;
  DebugMessage(PeerIP+'Connected to DB');
  FAdoQuery:=TAdoQuery.Create(nil);  //创建查询控件。
  FAdoQuery.Connection:= Fadoconnection;
  //下面将要创建 TBCSample类。
  BCSample:=TBCSample.Create(Fadoconnection);
  BCSample.SetSocket(PeerSocket);                       //进行套结字赋值。
  BCSample.SetDebugList(debugList);
  //
  BCSample.CallTime:=FormatDateTime('YYYY-MM-DD hh:mm:ss',StrtoDateTime(btime)+11/24/60);
  DebugMessage('################'+BCSample.CallTime);
 { if not BCSample.SetIdAndVer then                     //如果设置机器的设备号失败,则进行跳转。
    if not BCSample.SetIdAndVer then  goto endp;
  DebugMessage('设置设备号成功');   }
  ErrCode:=ciReadIdErr;                                 //ciReadIdErr:=1 读ID错。
  if not BCSample.ReadIdAndVer then                     //如果取得不到机器的设备号,则进行跳转。
    if not BCSample.ReadIdAndVer then  goto endp;
  DebugMessage('接受成功,取得设备号'+BCSample.DeviceNO);
  //上面可以接受到数据了
  //取得了设备的编号,从数据库进行查询 取得设备的类型,状态,设备的工作站编号,及回传的id,如果为使用,并得到样本人的编号
  if not BCSample.GetDeviceInfo then
  begin
    DebugMessage('ip:'+PeerIP+' port:'+inttostr(PeerPort)+' DeviceNO:'+BCSample.DeviceNO+' 没有该设备号!' );
    BCSample.Tranfinish(Err_SetupER);    //通讯成功,但连接设备的设置参数有问题。
    goto endp;
  end;
 
  {********设备为使用状态*********}
  if BCSample.OnDeviceStateNo='02' then
  begin
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' DeviceState: 运行');
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 监测点编号:'+BCSample.PointNo);
    Synchronize(UpdateDisply);
    if BCSample.CheckChannelUpdate then
    begin
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道信息');
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道FM频点信息清除!');
      ErrCode:=ciClearFMErr;                        // ciClearFMErr=2;          清除FM调频频点出错。
      //******清除设备调频频点信息FM******
      if not BCSample.clearFMValue then
        if not BCSample.clearFMValue then goto endp;
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道FM频点信息清除成功!');
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道FM频点信息写入!');
      ErrCode:=ciWriteFMValueErr;                         //ciWriteFMValue=3;      //写FM调频频点出错。
      if not BCSample.writeFMValue then
        if not BCSample.writeFMValue then goto endp;
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道FM频点信息写入成功!');
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道AM频点信息清除!');
      ErrCode:=ciClearAMErr;        //ciClearAMErr=4;                      //清除AM调频频点出错。
      if not BCSample.clearAMValue then
        if not BCSample.clearAMValue then goto endp;
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道AM频点信息清除成功!');
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道AM频点信息写入!');
      ErrCode:=ciWriteAMValueErr;      //ciWriteAMValue=5;                    //写AM调频频点出错。
      if not BCSample.writeAMValue then
        if not BCSample.writeAMValue then goto endp;
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道AM频点信息写入成功!');
      if not BCSample.UpdateChannelLog then
        if not BCSample.UpdateChannelLog then goto endp;
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 更新指定频道标记成功!');
    end
    else
    begin
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道未更改');
    end;
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道场强仪时钟!');
    ErrCode:= ciReadDeviceTimeErr;                //ciReadDeviceTimeErr=12;             //读取设备时钟出错
    if not BCSample.ReadDeviceTime then
      if not BCSample.ReadDeviceTime then goto endp;    //取得不了机器时钟,就没有意义,不用再往下进行。
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道场强仪时钟成功!');
    timedif:=round((BCSample.Devicetime - now)*SecsPerDay);          //*******取得时差*********
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 校验指定频道场强仪时钟!');
    ErrCode:=ciWriteDeviceTimeErr;               //ciWriteDeviceTimeErr=6;              //写时钟出错。
    if not  BCSample.WriteDeviceTime then
      if not  BCSample.WriteDeviceTime then goto endp;
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 校验指定频道场强仪时钟完成!');   //
 
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道溢出标志!');
    ErrCode:=ciGetFlowErr;      //ciGetFlowErr=16;            //读取溢出标志出错
    if not BCSample.recordIsOverFlow then
      if not BCSample.recordIsOverFlow then goto endp;
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道溢出标志完成!');
    if BCSample.OnisSetTimeSpace = '1' then //指定频道或自动频道的间隔时长有变化。
    begin
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 指定频道或自动侦测监测间隔时长有变化!');
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道循环监测间隔时长!');
      ErrCode:=ciwriteWatchValidTimeErr;      //ciwriteWatchValidTimeErr=7;            //写循环监测时长出错
      if not BCSample.writeWatchValidTime then
        if not BCSample.writeWatchValidTime then goto endp;
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道循环监测间隔时长完成!');
      ErrCode:=ciISEQUAlAllChannelSearchIntervalaErr;  //ciISEQUAlAllChannelSearchIntervalaErr:=25
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置自动侦测循环监测间隔时长!');
      ErrCode:=ciwriteAllChannelSearchIntervalaErr;  //ciwriteAllChannelSearchIntervalaErr:=18
      if not BCSample.writeAllChannelSearchIntervala then
        if not BCSample.writeAllChannelSearchIntervala then goto endp;  //如果不能设置自动全频道循环监测间隔时长,则跳转
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置自动侦测循环监测间隔时长成功!');
    end;
{
    100108_ZZF_现在是监测完成自动回传
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传时间!');
    ErrCode:=ciwriteBackTimeErr;                              //ciwriteBackTimeErr:=8;              //写回传时间出错
    if not BCSample.writeBackTime then
      if not BCSample.writeBackTime then  goto endp;
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道指定频道场强仪回传时间成功!');
}
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传IP地址!');
    ErrCode:=ciSetDeviceIPErr;                    // ciSetDeviceIPErr=9;         //设置ip地址出错
    if not BCSample.SetDeviceIP then
    begin
      if not BCSample.SetDeviceIP then
      begin
        WriteSetDeviceIPLog;     //写设置设备ip错误的日志信息。
        DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传IP地址失败!');
      end
      else
      begin
        DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传IP地址成功!');
      end;
    end
    else
    begin
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 设置指定频道场强仪回传IP地址成功!');
    end;
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道场强仪数据!');
    ErrCode:=ciReadWatchFSRecordErr;               //ciReadWatchFSRecordErr=13;          //读取场强数据出错
    if not BCSample.ReadWatchFSRecord then
      if not BCSample.ReadWatchFSRecord then  goto endp;
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取指定频道场强仪数据成功!');
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 清除指定频道场强仪数据!');
    ErrCode:=ciClearWatchFSRecordErr;            //ciClearWatchFSRecordErr=14;         //清除场强仪数据出错
    if not BCSample.ClearWatchFSRecord then
      if not BCSample.ClearWatchFSRecord then goto endp;
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 清除指定频道场强仪数据成功!');
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据到文件!');
    ErrCode:=ciSaveFileErr;                                                            //保存文件出错
    if not BCSample.SaveTvdata then
      if not BCSample.SaveTvdata then goto endp;
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据到文件成功!');
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据数据库!');
    try
      if not BCSample.WriteRecordtoDb then
        if not BCSample.WriteRecordtoDb then
          DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据数据库失败!')
        else DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据数据库完成,开始进行自动侦测!')
      else DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 保存指定频道数据数据库完成,开始进行自动侦测!');
    except
      on  e:Exception do DebugMessage(e.Message);
    end;
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 开启自动侦测读场强功能');
    ErrCode:=ciautoStartAllChannelSearchErr;  //ciautoStartAllChannelSearchErr:=17
    if BCSample.OnDeviceIsOpen='1' then
    begin
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测读场强功能以前已开启');
    end
    else
    begin
      if not BCSample.autoStartAllChannelSearch then  //如果第一次没有开启,在执行一次
        if not BCSample.autoStartAllChannelSearch then goto endp;
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 开启自动侦测读场强功能成功!');
    end;
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取自动侦测循环监测间隔时长!');
    ErrCode:=cireadAllChannelSearchIntervalaErr;  //cireadAllChannelSearchIntervalaErr:=19
    if not BCSample.readAllChannelSearchIntervala then
      if not BCSample.readAllChannelSearchIntervala then  goto endp;   // 读取自动全频道循环监测间隔时长部成功则调转。 //
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取自动侦测循环监测间隔时长成功!间隔:'+inttostr(BCSample.AllChanneljgtime));
 
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据是否溢出!');
    ErrCode:=cirecordAllChannelIsOverFlowErr;  //cirecordAllChannelIsOverFlowErr:=20
    if  BCSample.recordAllChannelIsOverFlow then
        DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 侦测自动侦测频点数据溢出!')
     else DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 侦测自动侦测频点数据没有溢出!');
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取自动侦测频点数据!');
    ErrCode:=ciReadAllChannelWatchFSRecordErr;  //ciReadAllChannelWatchFSRecordErr:=21
    if not BCSample.ReadAllChannelWatchFSRecord then
      if not BCSample.ReadAllChannelWatchFSRecord then  goto endp; // 读取侦测自动频点数据部成功 ,调转。
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 读取自动侦测频点数据成功!');
    DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+'  自动侦测数据大小: '+inttostr(BCSample.OnAllChannelRevContextSize));
    if BCSample.OnAllChannelRevContextSize>0 then           //如果全频道扫描的流大于零,接受数据后清空
    begin
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 清自动侦测频点数据!  ');
      ErrCode:=ciclearAllChannelSearchRecordErr;  //ciclearAllChannelSearchRecordErr:=22
      if not  BCSample.clearAllChannelSearchRecord then
        if not BCSample.clearAllChannelSearchRecord then  goto endp;  //如果清除不了所有频道监测的的数据,则跳转
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 清自动侦测频点数据成功!');
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到文件!');
      ErrCode:=ciSaveAllChannelTvdataErr;  //ciSaveAllChannelTvdataErr:=23
      if not  BCSample.SaveAllChannelTvdata then
        if not  BCSample.SaveAllChannelTvdata then goto endp; //如果保存不了所有频道监测的的数据到文件,则跳转
      DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到文件成功!');
      try
        DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到数据库!');
        ErrCode:=ciWriteAllChannelRecordtoDbErr;  //ciWriteAllChannelRecordtoDbErr:=24
        if not BCSample.WriteAllChannelRecordtoDb then
          if not BCSample.WriteAllChannelRecordtoDb then
            DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到数据库失败!')
          else  DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到数据库成功!')
        else  DebugMessage(PeerIP+' DeviceNO:'+BCSample.DeviceNO+' 自动侦测频点数据保存到数据库成功!');
      except
        on e:Exception do  DebugMessage(e.Message);
      end;
    end ;
  end;
  ErrCode:=Err_NONE;                        // Err_NONE=100   正确
  endp:
  BCSample.Tranfinish(ErrCode);
  debugList.Add('Errcode: '+inttostr(Errcode));
  debugList.Add('溢出标志: '+BCSample.flag);
  debugList.Add('全频道溢出标志: '+BCSample.flag);
  Writelog;
  //BCSample.destroy;
end;
7、边边角角的信息
//存储信息
procedure ThreadSocketRead.DebugMessage(mes:string);
begin
   if  gdebug then
   begin
     inforStr:=mes;
     synchronize(AddMes1);
   end;
end;
//打印信息到formmain.memo
procedure ThreadSocketRead.AddMes1;
begin
  if gdebug then
    formmain.Memo.Lines.Add(FormatDatetime('hh:mm:ss',Now)+'-*-'+inforStr);
end;
procedure ThreadSocketRead.removelist;
begin
  if not AppExit  and (DeviceItem<>nil) then
  begin
    DeviceItem.Delete;
  end;
end;


//

delphi编写winsocket的流程的更多相关文章

  1. DELPHI编写服务程序总结

    DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...

  2. DELPHI编写服务程序总结(在系统服务和桌面程序之间共享内存,在服务中使用COM组件)

    DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...

  3. 转 : 用Delphi编写安装程序

    http://www.okbase.net/doc/details/931  还没有亲自验证过,仅收藏 当你完成一个应用软件的开发后,那么你还需要为该软件做一个规范化的安装程序,这是程序设计的最后一步 ...

  4. scala中如何编写自定义的流程控制结构

    scala是一种函数式编程风格的语言,除了常见的if......else  ,for ,while等传统的流程控制结构,也可以自定义流程控制的控制结构. 再了解scala如何实现编写新的流程结构,我们 ...

  5. 用Delphi实现WinSocket高级应用

    用Delphi实现WinSocket高级应用 默认分类   2009-12-19 16:48   阅读6   评论0   字号: 大大  中中  小小 Socket通信在Windows 中是排队的形式 ...

  6. delphi编写dll心得, 谢谢原作者的分享。转

    delphi编写dll心得 1.每个函数体(包括exports和非exports函数)后面加 'stdcall;', 以编写出通用的dll2.exports函数后面必须加'export;'(放在'st ...

  7. Qt调用Delphi编写的COM组件

    这个问题捣鼓了两天,现在终于解决了,做个笔记分享给大家,以免走弯路 起初,我的想法是在DLL中写一个interface并从函数中导出这个interface,像这样的代码 ICom1 = interfa ...

  8. 利用Delphi编写Socket通信程序

    一.Delphi与Socket 计算机网络是由一系列网络通信协议组成的,其中的核心协议是传输层的TCP/IP和UDP协议.TCP是面向连接的,通信双方保持一条通路,好比目前的电话线,使用telnet登 ...

  9. Node.js编写be的流程(express)

    Node.js编写be的流程 1.当前项目目录下首先安装express 2.自动生成express插件结构 express -e 3.执行完前两步的效果      4.此时的package.json ...

随机推荐

  1. H TML5 之 (7) 俄罗斯方块效果

    下载是模拟的俄罗斯方法的效果,在下落的情况下,能 <!DOCTYPE HTML> <html> <head> <title>Shot</title ...

  2. [日历] C#修改CNDate日历帮助类 (转载)

    点击下载 CNDate.rar 主要功能如下 .传回公历y年m月的总天数 .根据日期值获得周一的日期 .获取农历 #region 私有方法 private static long[] lunarInf ...

  3. C# DbHelperSQLP,操作不同的数据库帮助类 (转载)

    本类主要是用来访问不同数据库而编写的主要功能如下 .数据访问基础类(基于不同数据库),主要是用来访问不同数据库的. .得到最大值:是否存在:是否存在: . 执行SQL和Orace语句,返回影响的记录数 ...

  4. Windows下的进程【一】

    什么是进程?进程就是一个正在运行的程序的实例,由两部分组成: 内核对象.操作系统用内核对象对进程进行管理,内核对象是操作系统保存进程统计信息的地方. 地址空间.其中包含所有可执行文件或DLL模块的代码 ...

  5. 关于项目既要使用ant脚本又要使用maven pom.xml文件的问题

    背景:项目使用的是ant脚本打包,但又需要maven去执行sonar代码扫描.所以项目中既有build.xml又有pom.xml build.xml设置的打包后产物文件夹为target,maven运行 ...

  6. gpload的简单实用

    准备工作: 1.因为gpload是对gpfdist的封装,因此使用gpload之前必须开启gpfdist的服务,不然无法使用. gpfdist -d /home/admin -p 8181 -l /t ...

  7. linux系统中whereis的用法详解

    whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 和find相比,whereis查找的速度非 ...

  8. Eyeshot Ultimate 学习笔记(1)

    在Winform项目中用到3D技术,这是在做项目一段时间以来第一次,还是指定的3D控件Eyeshot Ultimate,这个控件名称用度娘搜索,竟然毫无结果,不知道是没有人用过还是觉得该控件过于简单, ...

  9. Shortcut Collapse project or projects in the Solution Explorer Microsoft Visual Studio 2008

    The standard windows keyboard shortcuts for expanding and collapsing treeviews are: Numeric Keypad * ...

  10. learn-python3

    # learn-python3   这是我初学Python时写的一套Python基础示例程序.主要基于廖雪峰老师的Python3教程和<<深入理解Python>>. 感谢! 下 ...