很多时候,我总是对本机上的某些应用程序向服务器发送了什么很感兴趣,并且常想过如果能修改发送的信息或者能自己分析接受到的信息将是多么有趣的事情,但我不知道要如何解决这个问题……要用什么控件,应该不用接触到数据链路层什么的吧……

解决方案 »

  1.   

    串口通讯的监听(for GPS)
    unit frmComm;interfaceuses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls, ComCtrls,GeoUtils,GeoGPS;const MAXBLOCK = 160;type
    TComm = record
    idComDev : THandle;
    fConnected : Boolean;
    end;TCommForm = class(TForm)ComboBox1: TComboBox;
    Button1: TButton;
    StatusBar1: TStatusBar;
    Button2: TButton;
    ComboBox2: TComboBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    private
    { Private declarations }
    public
    { Public declarations }
    end;TCommThread = Class(TThread)protected
    procedure Execute;override;
    public
    constructor Create;end;varCommForm: TCommForm;
    CommHandle : THandle;
    Connected : Boolean;
    CommThread : TCommThread;implementation{$R *.DFM}uses
    frmMain,frmMdiMapView;procedure TCommThread.Execute;
    var
    dwErrorFlags,dwLength : DWORD;
    ComStat : PComStat;
    fReadStat : Boolean;
    InChar : Char;
    AbIn : String;
    XX,YY : double; //经度、纬度
    VID : string; //车号
    begin
    while Connected do begin
    GetMem(ComStat,SizeOf(TComStat));
    ClearCommError(CommHandle, dwErrorFlags, ComStat);
    if (dwErrorFlags > 0) then begin
    PurgeComm(CommHandle,(PURGE_RXABORT and PURGE_RXCLEAR));
    // return 0;
    end;
    dwLength := ComStat.cbInQue;
    if (dwLength>0) then begin
    fReadStat := ReadFile(CommHandle, InChar, 1,dwLength, nil);
    if (fReadStat) then begin
    if (InChar <> Chr(13)) and (Length(abIn) < MAXBLOCK+5 ) then AbIn := AbIn + InChar
    else begin
    ...
    {接收完毕,}
    end;//if (fReadStat>0){
    end; //if (dwLength>0){
    FreeMem(ComStat);
    end;{while}
    end;
    constructor TCommThread.Create;
    begin
    FreeOnTerminate := TRUE;
    inherited Create(FALSE); //Createsuspended = false
    end;
    //procedure TCommForm.Button1Click(Sender: TObject);
    var
    CommTimeOut : TCOMMTIMEOUTS;
    DCB : TDCB;
    fRetVal : Boolean;
    begin
    StatusBar1.SimpleText := '连接中...';
    CommHandle := CreateFile(PChar(ComboBox1.Text),GENERIC_READ,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, 0);
    if CommHandle = INVALID_HANDLE_VALUE then begin
    StatusBar1.SimpleText := '连接失败';
    Exit;
    end;
    StatusBar1.SimpleText := '已同端口 '+ ComboBox1.Text + ' 连接!';
    CommTimeOut.ReadIntervalTimeout := MAXDWORD;
    CommTimeOut.ReadTotalTimeoutMultiplier := 0;
    CommTimeOut.ReadTotalTimeoutConstant := 0;
    SetCommTimeouts(CommHandle, CommTimeOut);
    GetCommState(CommHandle,DCB);
    DCB.BaudRate := 9600;
    DCB.ByteSize := 8;
    DCB.Parity := NOPARITY;
    DCB.StopBits := ONESTOPBIT;
    fRetVal := SetCommState(CommHandle, DCB);
    if (fRetVal) then begin
    Connected := TRUE;
    try
    CommThread := TCommThread.Create;
    except
    Connected := FALSE;
    CloseHandle(CommHandle);
    fRetVal := FALSE;
    StatusBar1.SimpleText := '线程建立失败';
    Exit;
    end;
    end
    else begin
    Connected := FALSE;
    CloseHandle(CommHandle);
    end;
    end;procedure TCommForm.Button2Click(Sender: TObject);
    begin
    Connected := FALSE;
    CloseHandle(CommHandle);
    {终止线程}
    CommThread.Terminate;
    StatusBar1.SimpleText := '关闭端口'+ComboBox1.Text;
    end;procedure TCommForm.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    Connected := FALSE;
    CloseHandle(CommHandle);
    StatusBar1.SimpleText := '关闭端口'+ComboBox1.Text;
    end;end.
      

  2.   

    这个程序是For GPS的,能不能适用于别的程序呢?
    或者说这个程序本来是万能的,只是现在用来监视GPS?我更想知道监听的原理……
      

  3.   

    书中有云:建立一个WinSock,用Listen()来监听,连接信息,然后就能用Recv来读取信息,问题是,我要如何伪装成这个程序来给服务器发送信息呢?能有两个进程使用同一个进程吗?而且,我在读取信息后,原来的进程会不会接收不了该信息呢?还有很多问题,不过这两个是比较主要的……