我做代理服务器遇到一个问题,百思不得其解。估计是winsock控件本身的问题,现请教于大家:
我定义了两个winsock控件数组:lan专门和IE连接,wan和IE请求的网页连接。
lan(0)负责监听IE连接请求,如果收到请求,就在lan中找一个空闲的应答,接收到IE数据请求后,通过Wan连接真正的网页。收到后,把数据原样通过对应的lan发送回IE,通过记录接收和发送的字节,决定是否关闭向IE的连接。但现在的问题是,如果连接数一多,lan向IE发送数据有的能发送完,有的却不能发送完(总等也发不完),也就是通过lan(index).senddata发送数据,数据只在缓存区,我们并不知道它什么时候发送出去,也不能强制它立即发送出去。不知道怎么解决.Private Type Down
    recbyte As Long
    sendbyte As Long
End Type
Dim DownTag(100) As DownPrivate Sub Form_Load()
Lan(0).LocalPort = 8888 '此代理服务器监听的端口为8888
Lan(0).Listen '监听IE发来的连接网页的请求
For i = 1 To 100
    Load Lan(i)  '产生100个winsock元素待用
    Load WAN(i)
Next
End SubPrivate Sub Lan_ConnectionRequest(Index As Integer, ByVal requestID As Long)
For i = 1 To Lan.Count - 1
    If Lan(i).State = 0 Then '用一个空闲的lan来应答IE
     Lan(i).LocalPort = 0
     Lan(i).Accept requestID
     Exit For
    End If
Next
End SubPrivate Sub Lan_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim f$, Host$, Port As Integer
    Lan(Index).GetData f$, vbString
    WAN(Index).tag = f$
    rem .....此处有程序从f$中找出主机名和端口记入变量Host$, Port中,并且去掉代理标记:Proxy-
    WAN(Index).RemoteHost = Host$
    WAN(Index).RemotePort = Port
    WAN(Index).tag = f$  '把报头存起来
    WAN(Index).Connect
End SubPrivate Sub WAN_Connect(Index As Integer)
    WAN(Index).SendData WAN(Index).tag  '发送http头
    DownTag(Index).tcpbyte = 0
End SubPrivate Sub WAN_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim buff() As Byte, f$, Ss As Long
    WAN(Index).GetData buff, vbByte
    DownTag(Index).recbyte = DownTag(Index).recbyte + bytesTotal '记录下wan接收的字节
    Lan(Index).SendData buff
End SubPrivate Sub WAN_Close(Index As Integer)
 WAN(Index).Close
 If DownTag(Index).recbyte = DownTag(Index).sendbyte Then  '如果发送的字节和接收一样,并且wan已经关闭,说明向IE转发完成,则关闭连接
    Lan(Index).Close
 End If
End Sub
Private Sub Lan_SendComplete(Index As Integer)
If DownTag(Index).sendbyte = DownTag(Index).tcpbyte and wan(index).state=0 Then  '如果发送的字节和接收一样,并且wan已经关闭,说明向IE转发完成,则关闭连接
 Lan(Index).Close
end if
End Sub
Private Sub Lan_SendProgress(Index As Integer, ByVal bytesSent As Long, ByVal bytesRemaining As Long)
 DownTag(Index).sendbyte = DownTag(Index).sendbyte + bytesSent '记录下Lan发送的字节
End Sub