关于HTTP代理软件(100分)

  • 主题发起人 主题发起人 billwillman
  • 开始时间 开始时间
B

billwillman

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在在做一个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.
 
哪位大虾帮我解决一下,谢谢了
 
使用IOCP吧!
我以前用SELECT模型开发的代理服务器,速度不行.
其实这种代理服务器实现起来比较简单的!
你用INDY中的一个控件就可以实现了!
 
完成端口我知道性能是很好的,但是我是先使用异步I/O先来实现
以后再用这个,用INDY我也先试过了,但是有问题,比如回复给IE浏览器'你好',它会不断的发送给IE浏览器,再说INDY使用阻塞模式,性能上来说也是不行的.
现在也不知道为什么SEND就是没有办法返回给IE.
能帮我解决一下么????
 
没人回答,结帖子
 

Similar threads

后退
顶部