在DLL使用了clientsocket 连接远程服务器

hxyll520 2014-11-26 10:41:26
在DLL使用了clientsocket 连接远程服务器

同时我用远程注入DLL的方法,将这个DLL注入到其他进程中去。
里面的clientsocket 无法连接到服务器

请教高手这是怎么回事。。

需要使用非堵塞模式,请问到底应该如何操作,
给出相关代码最好,谢谢
...全文
467 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhz8000 2014-12-04
  • 打赏
  • 举报
回复
我也测试出来了确实是跟消息处理有关系! 楼主解决了不说出来不厚道!
xhz8000 2014-12-03
  • 打赏
  • 举报
回复
测试了一下注入QQ和系统Explorer.exe 都没有问题! 我的XP系统
xhz8000 2014-12-03
  • 打赏
  • 举报
回复
接收内容:test 接收时间:2014-12-03 10:38:25 这个是我的测试结果; 确实是使用阻塞方式是可以的,我这样猜想由于非阻塞使用了窗口, 当注入的线程结束后,就无法收到消息了,因为窗口是跟线程相关联的,所以无法连接到服务器.
「已注销」 2014-12-03
  • 打赏
  • 举报
回复
没代码讨论个毛
xhz8000 2014-12-03
  • 打赏
  • 举报
回复
自己解决了,谢谢各位 我还没解决非阻塞的呢?能告知如何解决非阻塞的吗?
hxyll520 2014-12-03
  • 打赏
  • 举报
回复
自己解决了,谢谢各位
xhz8000 2014-12-02
  • 打赏
  • 举报
回复
我写了一下不知道何原因就是不执行begin end 里面的代码! 注入的时候dll确实在别的进程能看到这个DLL了! 由于不执行初始化代码造成的! 不知道那位大侠知道怎么解决!
xhz8000 2014-12-01
  • 打赏
  • 举报
回复
由于是DLL注入就不存在重定位的问题了
xhz8000 2014-12-01
  • 打赏
  • 举报
回复
远程注入首先得开线程在目标进程运行,猜想你是由于非阻塞模式下,没有连接到服务器你就发送 数据,其实只有等到连接到服务器才能发送数据,但是你提前了。 由于是DLL注入就存在重定位的问题了
lyhoo163 2014-11-28
  • 打赏
  • 举报
回复
unit Unit_SocketDll;

interface

uses Dialogs,SysUtils,classes,Windows,Forms,stdctrls, scktcomp;

function ClientServerSocketDll(StrHostName:PChar; i_PortNo:integer; StrMsg:String; Var ResultStr:PChar):Boolean;export;


implementation

function ClientServerSocketDll(StrHostName:PChar; i_PortNo:integer; StrMsg:String; Var ResultStr:PChar):Boolean;
var ClientSocket1:TClientSocket;
    Stream : TWinSocketStream;
    Buffer : array[0 .. 1000] of Char;
    Str:string;
begin
     try
         ClientSocket1:=TClientSocket.Create(nil);
         ClientSocket1.Address:=StrHostName;
         ClientSocket1.Port:=i_PortNo;
         ClientSocket1.ClientType:=ctBlocking;
         ClientSocket1.Socket.Open(StrHostName,StrHostName,'',i_PortNo,true);
         Stream:=TWinSocketStream.Create(TCustomWinSocket(ClientSocket1.Socket),6000);
         if (ClientSocket1.Socket.Connected<>true) then
         begin
              Result:=False;
              Exit;
         end;
         ClientSocket1.Socket.SendText(Trim(StrMsg)+#10#13);
         if (Stream.WaitForData(120000)<>true) then
         begin
              Result:=False;
              MessageBox(Application.handle,'发送数据包到服务器发生超时错误!','超时错误',MB_OK+MB_ICONERROR);
              Exit;
         end;
         if (Stream.Read(buffer,1000)=0) then
         begin
              Result:=False;
              MessageBox(Application.handle,'Socket通迅包发生从服务器获取数据的错误!','无法获取数据',MB_OK+MB_ICONERROR);
              Exit;
         end;
         Str:=copy(Buffer,1,length(buffer));
         Result:=True;
         ResultStr:=PChar(Str);
     Except
            ClientSocket1.Socket.Close;
            Stream.Free;
            MessageBox(Application.handle,'Socket通迅发生了异常,请检查网络连接是否正常!','Socket异常',MB_OK+MB_ICONERROR);
            Result:=False;
     end;
end;
以上引自hmyhuo1983
hxyll520 2014-11-28
  • 打赏
  • 举报
回复
引用 4 楼 lyhoo163 的回复:
unit Unit_SocketDll;

interface

uses Dialogs,SysUtils,classes,Windows,Forms,stdctrls, scktcomp;

function ClientServerSocketDll(StrHostName:PChar; i_PortNo:integer; StrMsg:String; Var ResultStr:PChar):Boolean;export;


implementation

function ClientServerSocketDll(StrHostName:PChar; i_PortNo:integer; StrMsg:String; Var ResultStr:PChar):Boolean;
var ClientSocket1:TClientSocket;
    Stream : TWinSocketStream;
    Buffer : array[0 .. 1000] of Char;
    Str:string;
begin
     try
         ClientSocket1:=TClientSocket.Create(nil);
         ClientSocket1.Address:=StrHostName;
         ClientSocket1.Port:=i_PortNo;
         ClientSocket1.ClientType:=ctBlocking;
         ClientSocket1.Socket.Open(StrHostName,StrHostName,'',i_PortNo,true);
         Stream:=TWinSocketStream.Create(TCustomWinSocket(ClientSocket1.Socket),6000);
         if (ClientSocket1.Socket.Connected<>true) then
         begin
              Result:=False;
              Exit;
         end;
         ClientSocket1.Socket.SendText(Trim(StrMsg)+#10#13);
         if (Stream.WaitForData(120000)<>true) then
         begin
              Result:=False;
              MessageBox(Application.handle,'发送数据包到服务器发生超时错误!','超时错误',MB_OK+MB_ICONERROR);
              Exit;
         end;
         if (Stream.Read(buffer,1000)=0) then
         begin
              Result:=False;
              MessageBox(Application.handle,'Socket通迅包发生从服务器获取数据的错误!','无法获取数据',MB_OK+MB_ICONERROR);
              Exit;
         end;
         Str:=copy(Buffer,1,length(buffer));
         Result:=True;
         ResultStr:=PChar(Str);
     Except
            ClientSocket1.Socket.Close;
            Stream.Free;
            MessageBox(Application.handle,'Socket通迅发生了异常,请检查网络连接是否正常!','Socket异常',MB_OK+MB_ICONERROR);
            Result:=False;
     end;
end;
以上引自hmyhuo1983
谢谢楼上的,但是我需要使用的事非堵塞模式。因为数据量大。只能用非堵塞模式
lyhoo163 2014-11-27
  • 打赏
  • 举报
回复
有一办法,就是通过共享内存。连接TDataModule。
lyhoo163 2014-11-27
  • 打赏
  • 举报
回复
DLL不支持数据共享,clientsocket 当然不能连接数据库啦!
hxyll520 2014-11-27
  • 打赏
  • 举报
回复
clientsocket 在 DLL里的应用,不是连接数据库

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧