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. Bootstrap--全局css样式之表单

    单独的表单控件会被自动赋予一些全局样式.所有设置了 .form-control 类的 <input>.<textarea> 和 <select> 元素都将被默认设置 ...

  2. ASP.NET MVC——Controller的激活

    Controller的激活是根据在路由过程得到的Controller名称来创建对应的Controller对象.相关类如图: Controller激活的过程可通过如下序列图表示: 代码示例如下: str ...

  3. 通过C#去调用C++编写的DLL

    这个问题缠了我2个小时才弄出来,其实很简单.当对方提供一个dll给你使用时,你需要去了解这个dll 是由什么语言写的,怎么编译的,看它的编译类型.这样即使在没有头绪时,你可以先尝使用一些比较热门的编译 ...

  4. Spring Boot笔记(一)

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过 ...

  5. JSONP技术原理及实现

    跨域问题一直是前端中常见的问题,每当说到跨域,第一浮现的技术必然就是JSONP JSONP在我的理解,它并不是ajax,它是在文档中插入一个script标签,创建_callback方法,通过服务器配合 ...

  6. 【elasticsearch】(2)centos7 超简单安装elasticsearch 的监控、测试的集群工具elasticsearch head

    elasticsearch-head是elasticsearch(下面称ES)比较普遍使用的可监控.测试等功能的集群管理工具,是由H5编写的单独的网页程序.使用方法网上很多,这里教大家一个超简单安装h ...

  7. chromium安装flash

    sudo apt-get install pepperflashplugin-nonfree sudo update-pepperflashplugin-nonfree --install Flash ...

  8. ubuntu14.04 开启root登陆

    想要在登录界面使用root身份登录,可编辑/usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf文件, sudo gedit /usr/share/light ...

  9. BOM 之 location

    BOM 之 location它提供了与当前窗口中加载的文档有关的信息,还提供一些导航功能 .既是 window对象的属性,也是document对象的属性,就是说, window.location 和 ...

  10. 【随记】还原SQL Server数据库步骤

    情景:在一台机器上备份数据库,然后在另一台机器上还原数据库,可能会出现错误提示:System.Data.SqlClient.SqlError: 备份集中的数据库备份与现有的 'XXX' 数据库不同. ...