转自:
假如没必要的话,我劝你还是使用其它模式写代理程序.
用IOCP写单向发送的服务器,例如http服务器,ftp服务器什么的,逻辑还是很清楚的.但用来写双向性的服务器,象代理服务器(http代理服务器,socks5代理服务器)之类,逻辑会比较混乱.
......
最困难的就是用IOCP,我写的IOCP的代理服务器,IO_Handle中是包括另一个IIO_Handle的(目标的IO_Handle,因为代理服务器是双向的),还有在连接到目标服务器后,IOCP的代理服务器,就要向客户端和目标服务器,同时投递WSARecv(),这是因为你无法知道最先的数据流向的方向是从客户端流经代理,再到目标;还是从目标服务器流经代理,再到客户端的(象http,ftp等的访问,是目标服务器流经代理,到客户端的,而连接IRC服务器等,方向则是相向),以上就是我认为比较要害的两点.
以下是我的IOCP模型Socks5代理的IO_HANDLE数据:
typedef struct IO_HANDLE
{
SOCKET OriginalSocket;
IO_HANDLE *FinalHandle;
HANDLE DomainHandle;
char *DomainBuffer;
SOCKADDR_IN DestSocketAddress;
IODATA IOData;
DWORD TotalTransfer;
DWORD Timer;
BOOL IsActive;
省略部分数据
struct IO_HANDLE *Next;
}IOHANDLE,*LPIOHANDLE;
LPIOHANDLE IOHandleListHead = NULL;
阅读(1017) | 评论(0) | 转发(0) |