我现在在做一个HTTP代理软件,就是局域网中一台机器上网,其他机器通过这个软件都可以上网.
我使用异步I/O模型,但是收到FD_READ消息时,我调用SEND函数把数据写给IE,但是不知道为何IE就不显示.
代码如下:
unit Sockets;interface
uses
winsock2,winsock,windows,classes,Messages,SysUtils;
Type
TCSocket=Class(TObject)   //用于连接客户端的HTTP请求并且响应HTTP请求
 private
     PeerIp:string;                //远程连接的IP
     PeerPort:integer;            //远程连接的端口号
     Ip:string;                   //S的IP
     port:integer;              //s的端口号
     S,sAccept:TSocket;        //s为用做帧听,SACCEPT用做读去和发送信息的套接字
     CAddress:SockAddr_in;  //SOCKET的地址信息
     handle:Hwnd;       //接受SOCKET消息的窗体
     RecCount:integer; //要收到数据的总数
     Count:integer;//当前已经读取的的字节数
 procedure CreateSocket;
 Procedure FreeSocket;
 procedure Windowproc(var msg:TMessage);
 public
constructor Create;overload;
constructor Create(SocketIp:string;SocketPort:integer);overload;
Destructor Destroy;
procedure Error;
end;CONST
WM_SOCKET=WM_USER+5050;implementation{ TCSocket }constructor TCSocket.Create;begin
end;constructor TCSocket.Create(SocketIp: string; SocketPort: integer);
begin
    s:=0;
    handle:=0;
    Reccount:=0;
    Count:=0;
    Ip:=SocketIp;
    Port:=SocketPort;
    handle:=classes.AllocateHWnd(Windowproc);
    CreateSocket;end;procedure TCSocket.CreateSocket;
var
WSADATA:TWSADATA;
return:integer;
bOpt:ByteBool;
begin
    return:=WSAStartup(makeword(2,2),wsadata);
   if return=SOCKET_ERROR then
   begin
   Messagebox(0,'无法使用TCP/IP协议,请检查网络设备','出错',MB_OK or MB_ICONERROR);
   Error;
   exit;
   end;
   s:=Socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
   if s= INVALID_SOCKET then
   begin
    Messagebox(0,'无法启动TCP/IP协议,请安装网络协议','出错',MB_OK OR MB_ICONERROR);
    Error;
    exit;
   end;
   CAddress.sin_family:=AF_INET;
   CAddress.sin_port:=htons(port);
   CAddress.sin_addr.S_addr:=inet_addr(pchar(ip));
   Bind(s,CAddress,sizeof(CAddress));
   WSAAsyncSelect(s,handle,WM_SOCKET,FD_ACCEPT OR FD_CLOSE);
   bOpt:=false;   Listen(s,15);
  //
   if setsockopt(s,SOL_SOCKET,SO_REUSEADDR,PChar(@bOpt),1)<>0 then Messagebox(0,'error','',0);
end;destructor TCSocket.Destroy;
begin
FreeSocket;
end;procedure TCSocket.Error;
begin
  FreeSocket;
end;procedure TCSocket.FreeSocket;
begin
if s<>0 then
Begin
  shutdown(s,SD_BOTH);
  closesocket(s);
end;
     WSACLEANUP();
if handle<>0 then
  classes.DeallocateHWnd(handle);
end;procedure TCSocket.Windowproc(var msg: TMessage);
var
sendstr:string[255];
begin
  case msg.Msg of
  WM_SOCKET:Begin
              fillchar(sendstr,length(sendstr),#0);
                 if WSAGETSELECTERROR(msg.LParam)=1 then
                 begin
                    Error;
                    exit;
                 end;                 case WSAGETSELECTEVENT(msg.LParam) of
                    FD_ACCEPT:Begin
                                  sAccept:=accept(msg.WParam,nil,nil);     //用 SACCEPT 套接字代理 S 套接字读取和写入数据
                                  WSAAsyncSelect(sAccept,handle,WM_SOCKET,FD_READ OR FD_CLOSE or FD_WRITE);
                                  exit;
                              End;                    FD_CLOSE:Begin
                               closesocket(msg.wparam);  //就是关闭 S 套接字
                               exit;
                             End;                    FD_READ:Begin
                             // SendStr:='你好';
                              //Messagebox(0,'aa','',0);
                            //  winsock.ioctlsocket(msg.WParam,)
                            if Reccount=0 then
                            begin
                             winsock.ioctlsocket(msg.WParam,FIONREAD,Reccount);
                             count:=0;
                            end;                                winsock.recv(msg.wparam,sendstr,255,0);
                                count:=count+255;
                              if count>=Reccount then
                              begin
                              Reccount:=0;
                              SendStr:='你好'+#13#10;
                            //  Messagebox(0,pchar(inttostr(count)+':'+inttostr(reccount)),'',0);
                                send(msg.WParam,sendstr,6,0);
                              end;
                            End;
                    FD_WRITE:Begin
                             //   SendStr:='你好';
                             // Messagebox(0,'aa','',0);
                              // winsock.send(msg.wparam,SendStr,length(SendStr),MSG_DONTROUTE);
                             End;
                 end;
            End;
  end;
end;end.

解决方案 »

  1.   

    用ICS的第三方控件吧
    呵呵
      

  2.   

    用ICS控件,不是吧??
    今天中午我不用IE,我自己写了一个程序连接端口可以获得返回的数据,但是,还是没有办法和IE交换数据.
    哪位高手能解决一下??
    谢谢了~~~~~~~~~~~~~~!!!
    楼上的好多星星呀~~~~!!!
    能不能帮我解决一下,谢了~~~~!!!!
    万分感谢!!!!!!!
      

  3.   

    自己搞定了
    但是还有一个问题,JS和CSS文件怎么返回给用户客户端