下面是几个在Unix下创建Socket Server的通用函数:
int socket_get()
{
int iSocketid; if( (iSocketid = socket(AF_INET,SOCK_STREAM,0)) < 0)
return -1;
else
return iSocketid;
}int socket_open( int iSockid )
{
int iRetval;
struct sockaddr_in server;
struct servent *services;
struct hostent *hostptr;
char cHostname[MAXBUFLEN]; server.sin_family = AF_INET; strcpy (cHostname ,"TanSo_Server");
hostptr = gethostbyname(cHostname);
if (hostptr == NULL )
return -1; memcpy ( (char *)&server.sin_addr,hostptr->h_addr_list[0], hostptr->h_length);
services = getservbyname("TVOC_SERVER","tcp");
if (services == NULL)
return -2;
server.sin_port = services->s_port ; iRetval = connect (iSockid, (struct sockaddr *)&server,sizeof(server));
if ( iRetval < 0)
return -3;
else
return 0;
}
int socket_read( int iSocketid ,char *cSockTxt)
{
int iLenth,iLen=1032;
char *cTp;
struct msg_head *sTemp; assert(cSockTxt);
cTp = cSockTxt;
again:
iLenth =  read(iSocketid ,cTp,iLen);
if (iLenth < 0 )
{
if(errno==EAGAIN||errno==EINTR||errno==EWOULDBLOCK)
goto again;
return -1;
}
if(iLenth == 0)
return -1;
if(iLenth <iLen)
{
iLen -=iLenth;
cTp +=iLenth;
goto again;
}
sTemp = (struct msg_head *)cSockTxt;
PRINT(msg)("%s Receive Msg [%d] from SQ[%d] is:
Type[%x]
Len[%d]
Txt[%s]\n",
__NOWTIME__,iLenth,iSocketid,sTemp->MSG_HEAD.m_type,
sTemp->MSG_HEAD.m_len,sTemp->m_txt); return 0;
}int socket_listen(int iSocket)
{
int iRetu;
struct sockaddr_in sServer;
struct servent *services;
int iLen = sizeof(struct sockaddr); sServer.sin_family = AF_INET;
sServer.sin_addr.s_addr = INADDR_ANY; services = getservbyname("TVOC_SERVER","tcp");
if (services == NULL)
{
PRINT(err)("%s Err:[%s][%s][%d]--Can't get services[%s]\n",__NOWTIME__,__FILE__,__FUNCTION__,__LINE__,strerror(errno));
return -1;
}
sServer.sin_port = services->s_port ; iRetu = bind (iSocket,(struct sockaddr *)&sServer,iLen);
if (iRetu < 0)
{
PRINT(err)("%s Err:[%s][%s][%d]--Bind socket:%d err:[%s]\n",__NOWTIME__,__FILE__,__FUNCTION__,__LINE__,iSocket,strerror(errno));
return -1;
}
iRetu = listen (iSocket,20);
if(iRetu < 0)
{
PRINT(err)("%s Err:[%s][%s][%d]--Listen socket:%d err:%d\n",__NOWTIME__,__FILE__,__FUNCTION__,__LINE__,iSocket,errno);
return -1;
}
return iRetu;
}int socket_accept(int iSocket,char *cIpAddr)
{
int iRetu;
struct sockaddr_in sServer;
int iLen = sizeof(struct sockaddr); iRetu = accept(iSocket,(struct sockaddr *)&sServer,&iLen);
if (iRetu < 0)
{
PRINT(err)("%s Err:[%s][%s][%d]--Accept socket:%d err:%s\n",__NOWTIME__,__FILE__,__FUNCTION__,__LINE__,iSocket,strerror(errno));
memset((char *)&cIpAddr,0,20);
return -1;
}
memcpy((char *)cIpAddr,inet_ntoa(sServer.sin_addr),20);
return iRetu;
}int socket_close(int iSocket)
{
int iRetu; iRetu = close(iSocket);
if (iRetu < 0)
{
PRINT(err)("Close socket:%d err:%s\n",iSocket,strerror(errno));
return -1;
} return 0;
}在Unix上创建Socket Server的步骤是:
1.创建Socket文件句柄
2.Listen
3.Accept
4.如果Accept的值>0,则表示有Client的Socket请求
5.Read是读Client
6.Write是写Client在Client端可用一些Socket控件,指明Host,和Port便可.
在Cilent端是用事件驱动的和服务端的原理差不多.
unit Uni_Socket;interfaceuses scktcomp,SysUtils,Dialogs,Uni_Message,stdctrls,Forms,Windows;type
  TVOCMessage = Class
   FCS: TClientSocket;
   Procedure ReceiveMessage(Sender: TObject; Socket: TCustomWinSocket);
   Function SendMessage :Integer;
  private
{ Private declarations } caSendMessage :Boolean; Procedure SetPort(Value :Integer);
Function  GetPort :Integer; Procedure SetAddress(Value :String);
Function  GetAddress :String; Procedure CSError(Sender: TObject; Socket: TCustomWinSocket;
ErrorEvent: TErrorEvent; var ErrorCode: Integer);
Procedure CSConnect(Sender: TObject; Socket: TCustomWinSocket);    Procedure CSConnecting(Sender: TObject; Socket: TCustomWinSocket);
    Procedure CSDisConnect(Sender: TObject; Socket: TCustomWinSocket);
  public
{ Public declarations }
IsVOCMsg :Boolean;
caReciveMsg :Boolean;
ToDevID :Array[0..6] Of Char; //f:File of TMessageHead;
SubTrans :Array[0..7] of TSubTrans ; Msghead :TMessageHead; MsgError :TMsgError;
ConState :TConnectState;
DevState :TDeviceState;
RunState :TRunState;
OptState :TOperationState;
OptList :TOperationList;
VOCList :TVoiceList;
ChkDevState :TCheckDeviceState;
EnterCommandShell :TEnterCommandShell;
QuitCommandShell :TQuitCommandShell;
SendCommand :TSendCommand;
        SetRunTime :TSetRunTime;
AskCon :TAskConnect;
DevCheck :TDeviceCheck;
HaltOpt :THaltOperation;
RunOpt :TRunOperation;
GetOptList :TGetOperationList;
GetVoclist :TGetVoicelist;
Rec :TRecord;
Play :TPlay;
Dial :TDial;
HandUp :THandup;
Package :TPackage;
DeleteOpt :TDeleteOperation;
UpdateUserList :TUpdateUserList;
caAccess :Boolean;
TestBuf :TBuffer; Constructor Create;
Procedure MakeMessage(Var aMsg :TMessageHead;aScrAdr,aDesAdr :Char;aOptNum:Char;aDataLen :Word);  Published Function Connect :Boolean;
Function DisConnect :Boolean; Property  Port :Integer Read GetPort Write SetPort;
Property  Address:String Read GetAddress Write SetAddress;
  end;implementationuses Uni_Center;procedure TVOCMessage.MakeMessage(Var aMsg :TMessageHead;aScrAdr,aDesAdr :Char;aOptNum :Char;aDataLen :Word);
Begin
aMsg.Head := 'MSG';
aMsg.SrcAdr := aScrAdr;
aMsg.DesAdr := aDesAdr;
aMsg.OptNum := aOptNum;
aMsg.DataLen := aDataLen;
End;
//创建Socket
constructor TVOCMessage.Create;
Begin
FCS := TClientSocket.Create(nil);
FCS.ClientType := ctNonBlocking;
FCS.OnRead := ReceiveMessage;
// FCS.OnWrite := SendMessage;
FCS.OnError := CSError;
FCS.OnConnect := CSConnect;    //
    FCS.OnConnecting := CSConnecting;
    FCS.OnDisconnect := CSDisconnect; caReciveMsg := True;
caSendMessage := False;
caAccess := True;
End;Procedure TVOCMessage.CSConnect(Sender: TObject; Socket: TCustomWinSocket);
Begin
If Socket.Connected Then
caSendMessage := True;
End;
Procedure TVOCMessage.CSError(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
Begin
Case ErrorEvent of
eeConnect:
Begin
caAccess := False; //FCenter.Close;
raise ESocketError.CreateFmt('发生错误在连接时:'+LoadStr(M_ConnectError),[]) ;
End;
eeSend:
raise ESocketError.CreateFmt('发生错误在发送时:'+LoadStr(M_SendError),[]);
eeReceive:
raise ESocketError.CreateFmt('发生错误在接收时:'+LoadStr(M_WriteError),[]);
End;
End;Procedure TVOCMessage.ReceiveMessage(Sender: TObject; Socket: TCustomWinSocket) ;
Var //MsgEof :Char;
i,RecLen:Integer;
//Temp :Array[0..1023] of Char;
RecBuffer :TBuffer;
   LogFile :TextFile;
//        ntime :cardinal;
Begin
  //处理状态消息
  If FCenter.Memo2.Lines.Count > 3000 Then
  Begin
   AssignFile(LogFile,ExtractFilePath(Application.ExeName)+'MSGREC.log');
    If FileExists(ExtractFilePath(Application.ExeName)+'MSGREC.log') Then
    Append(LogFile)
    Else
        ReWrite(LogFile);    If FileSize(LogFile) > MaxFileSize Then
    Begin
        CopyFile(PChar(ExtractFilePath(Application.ExeName)+'MSGREC.log'),
                PChar(ExtractFilePath(Application.ExeName)+'REC' +FormatDateTime('yymmddhhmmss',Now)+'.log'),
                False);
        DeleteFile(PChar(ExtractFilePath(Application.ExeName)+'MSGREC.log'));
        CloseFile(LogFile);
        AssignFile(LogFile,ExtractFilePath(Application.ExeName)+'MSGREC.log');
        ReWrite(LogFile);
    End;    Writeln(LogFile,'--------------------------------' + FormatDateTime('yyyy-mm-dd hh:mm:ss',Now) + '--------------------------------');
    WriteLn(LogFile,FCenter.Memo2.Lines.Text);
    Flush(LogFile);
    CloseFile(LogFile);
    FCenter.Memo2.Lines.Clear;
  End;
  FCenter.Memo2.Lines.Add(#13#10+'The Socket :'+IntToStr(FCS.Tag));
  FCenter.Memo2.Lines.Add(FormatDateTime('hh:mm:ss',Now) + 'Receive Message:');//  If Not caReciveMsg Then Exit; reed by wzy 2001.6.5
//  caReciveMsg := False;        reed by wzy 2001.6.5
  With Socket Do
  Begin
For i:=0 To Sizeof(RecBuffer.Data) - 1 Do
RecBuffer.Data := #0;
RecBuffer.DataLen := 0;
RecBuffer.DesAdr := #0;
RecBuffer.SrcAdr := #0;
RecBuffer.Head := '';
RecBuffer.OptNum := #0;
RecLen := ReceiveBuf(RecBuffer,1033);//SizeOf(RecBuffer));
//If RecLen > 1032 Then
// ReceiveBuf(Temp,1024);
 // While RecLen > 0 Do
// Begin
MsgHead.Head[0] := RecBuffer.Head[0];
MsgHead.Head[1] := RecBuffer.Head[1];
MsgHead.Head[2] := RecBuffer.Head[2];
MsgHead.SrcAdr := RecBuffer.SrcAdr ;
MsgHead.DesAdr := RecBuffer.DesAdr ;
MsgHead.OptNum := RecBuffer.OptNum ;
MsgHead.DataLen := RecBuffer.DataLen;
        FCenter.Memo2.Lines.Add('Head:'+RecBuffer.Head+' Src:#'+IntToStr(Ord(RecBuffer.SrcAdr))+' Des:#' + IntToStr(Ord(RecBuffer.DesAdr))+ ' Len:' + IntToStr(RecBuffer.DataLen));
        FCenter.Memo2.Lines.Add('OptNum:#'+IntToStr(Ord(RecBuffer.OptNum)));
        FCenter.Memo2.Lines.Add('Data:'+ RecBuffer.Data);
{        For i:=0 To RecBuffer.DataLen Do
        Begin
            If (RecBuffer.Data[i] in ['0'..'9']) or (RecBuffer.Data[i] in ['a'..'z']) or (RecBuffer.Data[i] in ['A'..'Z']) Then
            Begin
                FCenter.Memo2.Lines.Text := FCenter.Memo2.Lines.Text +''''+RecBuffer.Data[i]+''','
            End Else
//            Else If (ord(RecBuffer.Data[i]) > 125) Then
//            Begin
//                FCenter.Memo2.Lines.Text := FCenter.Memo2.Lines.Text +''''+RecBuffer.Data[i] + RecBuffer.Data[i+1]+''','
//            End Else
                FCenter.Memo2.Lines.Text := FCenter.Memo2.Lines.Text + '#'+IntToStr(Ord(RecBuffer.Data[i]))+','
        End;
}
If (UpperCase(MsgHead.Head) <> 'MSG') or (RecLen = 0 ) Then
Begin
//ReceiveBuf(Temp,1024);
Exit;
End;
// RecLen := MsgHead.DataLen;
If MsgHead.OptNum = '' Then Exit;
SubTrans[Integer(MsgHead.OptNum)].TransType := MsgHead.OptNum;
SubTrans[Integer(MsgHead.OptNum)].TransState := RecBuffer.Data[MsgHead.DataLen - 1];
RecBuffer.Data[MsgHead.DataLen - 1] := #0;
MsgHead.DataLen := MsgHead.DataLen - 1;
Case MsgHead.OptNum Of
S_MsgError:
Begin
//RecLen := ReceiveBuf(MsgError,MsgHead.DataLen);
For i:= 0 To High(DeviceType) Do
MsgError.DevID[i] := RecBuffer.Data[i];
For i:=High(DeviceType) + 1To MsgHead.DataLen - 1 Do
MsgError.Describe[i-High(DeviceType)-1] := RecBuffer.Data[i]; For i := 0 To High(DeviceType) Do ToDevID[i] := MsgError.DevID[i];
// FCenter.Memo2.Lines.Append(MsgError.Describe);
End;
S_ConnectState:
Begin
//RecLen := ReceiveBuf(ConState,MsgHead.DataLen);
ConState.State := RecBuffer.Data[0];
For i:=1 To MsgHead.DataLen - 1 Do
ConState.Describe[i-1] := RecBuffer.Data[i];// FCenter.Memo2.Lines.Append(ConState.Describe );
End;
S_DeviceState:
Begin
//RecLen := ReceiveBuf(DevState,MsgHead.DataLen);
DevState.State := RecBuffer.Data[0];
For i:=1 To MsgHead.DataLen - 1 Do
DevState.DevID[i-1] := RecBuffer.Data[i];
For i := 0 To High(DeviceType) Do ToDevID[i] := DevState.DevID[i];
// FCenter.Memo2.Lines.Append(DevState.State);
End;
S_RunState:
Begin
//RecLen := ReceiveBuf(RunState,MsgHead.DataLen);
For i:=0 To High(DeviceType) Do
RunState.DevID[i] := RecBuffer.Data[i];
For i:= High(DeviceType)+1 To MsgHead.DataLen - 1 Do
RunState.State := RecBuffer.Data[i];
For i := 0 To High(DeviceType) Do ToDevID[i] := RunState.DevID[i];
// FCenter.Memo2.Lines.Append(RunState.State);
End;
S_OperationList:
Begin
// SetLength(Temp,Msghead.DataLen);
// Temp := nil;
//RecLen := ReceiveBuf(Temp,Msghead.DataLen);
//For i:= 0 To MsgHead.DataLen - 1 Do
OptList.OptDesc := RecBuffer.Data ;
// FCenter.Memo2.Lines.Append(OptList.OptDesc);
End;
S_VoiceFileList:
Begin
//RecLen := ReceiveBuf(VocList,MsgHead.DataLen);
For i := 0 To SizeOf(VocList.Items) Do
VocList.Items[i] := #0;
For i:= 0 To MsgHead.DataLen - 1 Do
VocList.Items[i] := RecBuffer.Data[i];
// FCenter.Memo2.Lines.Append(VocList.Items);
End;
                        //返回业务运行状态;
S_OperationState:
Begin
For i :=0 To High(OptState.DevID) Do OptState.DevID[i] := #0;
For i :=0 To High(OptState.Describe) Do OptState.Describe[i] := #0;
OptState.State := Char(#0);
//RecLen := ReceiveBuf(OptState,MsgHead.DataLen);
For i := 0 To High(OptState.DevID) Do
OptState.DevID[i] := RecBuffer.Data[i];
OptState.State := RecBuffer.Data[High(OptState.DevID) + 1];
For i := High(OptState.DevID) + 2 To MsgHead.DataLen - 1 Do
OptState.Describe[i-High(OptState.DevID) - 2] := RecBuffer.Data[i];
For i := 0 To High(DeviceType) Do ToDevID[i] := OptState.DevID[i];
// FCenter.Memo2.Lines.Append(OptState.Describe); End;
S_CheckDeviceState:
Begin
   //RecLen := ReceiveBuf(ChkDevState,MsgHead.DataLen);
   //Showmessage('rec:' + Inttostr(temp));
For i:=0 To High(DeviceType) Do
ChkDevState.DevID[i] := RecBuffer.Data[i];
For i:=High(DeviceType) + 1 To MsgHead.DataLen - 1 Do
ChkDevState.Describe[i - High(DeviceType) - 1] := RecBuffer.Data[i];
For i := 0 To High(DeviceType) Do ToDevID[i] := ChkDevState.DevID[i];
// FCenter.Memo2.Lines.Append(ChkDevState.Describe);
End;
End;{END OF CASE} //ReceiveBuf(MsgEof,1);
// RecLen := RecLen + ReceiveBuf(MsgEof,1); //IsVocMsg := (RecLen = MsgHead.DataLen) And (MsgEof = Char($FF));
// IsVOCMsg := (MsgEof = Char($FF));
FCenter.HUBActive;
//    Application.ProcessMessages;
// caReciveMsg := True;      reed by wzy 2001.6.  End;{END OF WITH}End;Function TVOCMessage.SendMessage :Integer;
var
i :Integer;
SendBuffer :TSendBuffer;
Len ,SLen:Integer;
    LogFile :TextFile;
Begin
//处理控制消息
While Not caSendMessage Do Application.ProcessMessages;
For i := 0 To High(SendBuffer.Data) Do SendBuffer.Data[i] := #0;
SendBuffer.Head[0]   := Msghead.Head[0];
SendBuffer.Head[1]   := MsgHead.Head[1];
SendBuffer.Head[2]   := MsgHead.Head[2];
SendBuffer.SrcAdr    := Msghead.SrcAdr;
SendBuffer.DesAdr    := Msghead.DesAdr;
SendBuffer.OptNum    := Msghead.OptNum;
SendBuffer.DataLen   := Msghead.DataLen;
//Len := 0;
// IF Not FCS.Active Then
   // Repeat Until Connect;
// Connect;
Case MsgHead.OptNum Of
C_AskConnect:
Begin
//Len := SizeOf(AskCon);
// SetLength(SendBuffer.Data,Len);
//Len := Len + Sizeof(MsgHead) ;
For i := 0 To 9 Do
Begin
SendBuffer.Data[i] := AskCon.UserID[i];
SendBuffer.Data[i + 10] := AskCon.UserPsw[i];
End;
End;
C_DeviceCheck:
Begin
//Len := SizeOf(DevCheck);
// SetLength(SendBuffer.Data,Len);
//Len := Len + SizeOf(MsgHead);
For i := 0 To High(DeviceType) Do
SendBuffer.Data[i] := DevCheck.DevId[i];
End;
C_HaltOperation:
Begin
//Len := SizeOf(HaltOpt);
// SetLength(SendBuffer.Data,Len);
//Len := Len + Sizeof(MsgHead);
For i := 0 To High(OperationType)  Do
SendBuffer.Data[i] := HaltOpt.OptID[i];
For i := 0 To High(DeviceType)  Do
SendBuffer.Data[i+High(OperationType) + 1] := HaltOpt.DevID[i];
SendBuffer.Data[17] := HaltOpt.OptProc;
SendBuffer.Data[18] := HaltOpt.DevProc;
End;
C_RunOperation:
Begin
//Len := Sizeof(MsgHead) + StrLen(RunOpt.OptID);
For i := 0 To StrLen(RunOpt.OptID)  Do
SendBuffer.Data[i] := RunOpt.OptID[i];
End;
C_GetOperationList:
Begin
//Len := Sizeof(MsgHead);
// For i:=0 to 10 Do
// SetLength(SendBuffer.Data,0);
End;
C_GetVoiceList:
Begin
//Len := Sizeof(MsgHead) + MsgHead.DataLen ;
For i := 0 To MsgHead.DataLen Do
SendBuffer.Data[i] := GetVoclist.OptID[i];
End;
C_Record:
Begin
//Len := Sizeof(Rec);
// SetLength(SendBuffer.Data,Len);
//Len := Len + SizeOf(MsgHead) ;
SendBuffer.Data[0] := Rec.CrtlFlag;
For i :=1 To 11 Do
SendBuffer.Data[i] := Rec.OptID[i];
For i := 0 To High(DeviceType) Do
SendBuffer.Data[i+10] := DevCheck.DevId[i]; End;
C_Play:
Begin
//Len := SizeOF(Play);
// SetLength(SendBuffer.Data,Len);
//Len := Len + SizeOF(MsgHead) ;
SendBuffer.Data[0] := Play.CrtlFlag;
For i := 1 To 11 Do
SendBuffer.Data[i] := Play.OptID[i];
For i := 0 To High(DeviceType) Do
SendBuffer.Data[i+10] := DevCheck.DevId[i];
End;
C_Dial:
Begin
// SetLength(SendBuffer.Data,0);
End;
C_Handup:
Begin
// SetLength(SendBuffer.Data,0); End;
C_Package:
Begin
//Len := SizeOf(MsgHead) + SizeOf(Package);
For i:= 0 To 10 Do
SendBuffer.Data[i] := Package.OptID[i];
End;
C_DeleteOperation:
Begin
//Len := SizeOf(MsgHead) + SizeOf(DeleteOpt);
For i:= 0 To 10 Do
SendBuffer.Data[i] := DeleteOpt.OptID[i];
End;
C_UpdateUserList:
Begin
//undo it
End;
C_EnterCommandShell:
Begin
//Len:= SizeOf(MsgHead) + Sizeof(EnterCommandShell);
For i:=0 To High(DeviceType) Do
SendBuffer.Data[i] := EnterCommandShell.DevID[i];
End;
C_QuitCommandShell:
Begin
//Len:= SizeOf(MsgHead) + Sizeof(QuitCommandShell);
For i:=0 To High(DeviceType) Do
SendBuffer.Data[i] := QuitCommandShell.DevID[i];
End;
C_SendCommand:
Begin
//Len:= SizeOf(MsgHead) + MsgHead.DataLen;
For i:=0 To High(DeviceType) Do
SendBuffer.Data[i] := SendCommand.DevID[i];
For i:= 0 To StrLen(SendCommand.Command) - 1 Do
SendBuffer.Data[i+High(DeviceType)+1] := SendCommand.Command[i];
End;
             C_SetRunTime: //wzy 2001.1.7
Begin
//Len := Sizeof(MsgHead) + MsgHead.DataLen ;
For i := 0 To MsgHead.DataLen Do
SendBuffer.Data[i] := SetRunTime.OptID[i];
End;       End;      SendBuffer.Eof := Char($FF);      Len := Sizeof(SendBuffer);      SLen := FCS.Socket.SendBuf(SendBuffer ,Len);      IF Slen = 0 Then
     SLen := FCS.Socket.SendBuf(SendBuffer ,Len);//   FCenter.Memo1.Lines.Add(SendBuffer.Data);
  If FCenter.Memo1.Lines.Count > 3000 Then
  Begin
   AssignFile(LogFile,ExtractFilePath(Application.ExeName)+'MSGSEN.log');
    If FileExists(ExtractFilePath(Application.ExeName)+'MSGSEN.log') Then
    Append(LogFile)
    Else
        ReWrite(LogFile);    If FileSize(LogFile) > MaxFileSize Then
    Begin
        CopyFile(PChar(ExtractFilePath(Application.ExeName)+'MSGSEN.log'),
                PChar(ExtractFilePath(Application.ExeName)+'SEN' +FormatDateTime('yymmddhhmmss',Now)+'.log'),
                True);
        DeleteFile(PChar(ExtractFilePath(Application.ExeName)+'MSGSEN.log'));
        CloseFile(LogFile);
        AssignFile(LogFile,ExtractFilePath(Application.ExeName)+'MSGSEN.log');
        ReWrite(LogFile);
    End;    Writeln(LogFile,'--------------------------------' + FormatDateTime('yyyy-mm-dd hh:mm:ss',Now) + '--------------------------------');
    WriteLn(LogFile,FCenter.Memo1.Lines.Text);
    Flush(LogFile);
    CloseFile(LogFile);
    FCenter.Memo1.Lines.Clear;
  End;    FCenter.Memo1.Lines.Add(#13#10+'The Socket :'+IntToStr(FCS.Tag));
    FCenter.Memo1.Lines.Add(FormatDateTime('hh:mm:ss',Now)+' Send Message:');
    IF Slen > 0 Then
    Begin
        FCenter.Memo1.Lines.Add('Head:'+SendBuffer.Head+' Src:#'+IntToStr(Ord(SendBuffer.SrcAdr))+' Des:#' + IntToStr(Ord(SendBuffer.DesAdr))+ ' Len:' + IntToStr(SendBuffer.DataLen));
        FCenter.Memo1.Lines.Add('OptNum:#'+IntToStr(Ord(SendBuffer.OptNum)));
        FCenter.Memo1.Lines.Add('Data:'+ SendBuffer.Data);
    End Else
        FCenter.Memo1.Lines.Add('Error !!!');//      ShowMessage('len:' + inttostr(len) + sendbuffer.data);
  Result := SLen;End;//给Socket赋Port值
Procedure TVOCMessage.SetPort(Value :Integer);
Begin
FCS.Port := Value;
End;
Function TVOCMessage.GetPort :Integer;
Begin
GetPort := FCS.Port;
End;
//给Socket赋Address
Procedure TVOCMessage.SetAddress(Value :String);
Begin
FCS.Address := Value;
End;
Function TVOCMessage.GetAddress :String;
Begin
GetAddress := FCS.Address
End;
//连接主机
Function TVOCMessage.Connect :Boolean;
//Var S:Char;
Begin
// FCS.Socket.Open('',self.Address,'',self.Port);
        Result := False;
        If FCS = nil Then
                Exit;
Try
// FCS.Close;
// FCS.Open;
    If Not FCS.Active Then
        FCS.Active := True;
    FCS.Tag := StrToInt(FormatDateTime('hhmmssz',Now));
    FCenter.Memo1.Lines.Add('申请连接:'+ IntToStr(FCS.Tag));
    //CheckSocket.Resume;
Except
End;
Result := (FCS.Active = True);
End;
Function TVOCMessage.DisConnect :Boolean;
Begin
FCS.Active := False;
Result := (FCS.Active = False);
    //CheckSocket.Suspend;
End;Procedure TVOCMessage.CSConnecting(Sender: TObject; Socket: TCustomWinSocket);
Begin
    FCenter.Memo1.Lines.Add('等待Socket服务器响应:'+IntToStr(FCS.tag));
End;Procedure TVOCMessage.CSDisConnect(Sender: TObject; Socket: TCustomWinSocket);
Begin
    FCenter.Memo1.Lines.Add('Socekt客户端断开:'+IntToStr(FCS.tag));
End;
end.以上是部分源码,你还可以在网站上搜索一些相关文档,便可调试通过.中间有些是调用其它过程可以自己写.