Code: Select all
Structure LIVEDATA
thread.l;线程号
connetid.l;连接ID
targetid.l;目标连接ID
memory.l;缓存指针
EndStructure
Structure datatodatas
port.l;本地端口
targetip.s{100};转发IP
targetport.l;转发端口
server.l;服务创建号
event.l;事件
clientid.l;连接客户端
EndStructure
Global Dim Server.datatodatas(30)
Global start.l=0
Global iniuser=0
#File="c:\Setdata.ini"
#size=90000
Procedure NewConnet(n.s)
OnErrorGoto(?Error_NewConnet)
a=FindString(n,"\",1)
conneta=Val(Mid(n,1,a-1))
b=FindString(n,"\",a+1)
connetb=Val(Mid(n,a+1,b-a-1))
c=FindString(n,"\",b+1)
*MemoryID=Val(Mid(n,b+1,c-a-1))
Repeat
Delay(1)
If NetworkClientEvent(conneta)=#PB_NetworkEvent_Data
ReceiveNumber= ReceiveNetworkData(conneta,*MemoryID,#size)
If ReceiveNumber>0
Repeat
SendNumber=SendNetworkData(connetb,*MemoryID,ReceiveNumber)
If SendNumber=-1
Delay(5)
EndIf
Until SendNumber<>-1
EndIf
EndIf
If NetworkClientEvent(connetb)=#PB_NetworkEvent_Data
ReceiveNumber= ReceiveNetworkData(connetb,*MemoryID,#size)
If ReceiveNumber>0
Repeat
SendNumber=SendNetworkData(conneta,*MemoryID,ReceiveNumber)
If SendNumber=-1
Delay(5)
EndIf
Until SendNumber<>-1
EndIf
EndIf
Until 0
Error_NewConnet:
FreeMemory(*MemoryID)
ProcedureReturn 0
EndProcedure
;-主函数
Procedure.l main(n.l)
OnErrorGoto(?Error_main)
port.l=Server(n)\port
targetip.s= LTrim(RTrim(Server(n)\targetip))
targetport.l=Server(n)\targetport
USERNUMBER=0
Dim user.LIVEDATA(USERNUMBER)
For i =0 To USERNUMBER
ZeroMemory_(@user(i),SizeOf(LIVEDATA))
Next i
Server(n)\server=CreateNetworkServer(#PB_Any,Port)
If Not Server(n)\server
ProcedureReturn 0
EndIf
Repeat
Delay(1)
Until iniuser=0
OpenPreferences(#File)
PreferenceGroup(Str(n))
WritePreferenceLong("createok",1)
ClosePreferences()
Repeat
Delay(1)
Until start=1
Repeat
Error_main:
Delay(1)
Select Server(n)\event
Case #PB_NetworkEvent_Connect
Debug "new"
Server(n)\event=0
a=0
For i=1 To USERNUMBER
If user(i)\thread=0
a=i
EndIf
Next i
If a=0
USERNUMBER=USERNUMBER+1
a=USERNUMBER
ReDim user.LIVEDATA(USERNUMBER)
EndIf
For i=1 To 1
user(a)\targetid=OpenNetworkConnection(targetip,targetport)
If user(a)\targetid
*MemoryID=AllocateMemory(#size)
user(a)\memory=*MemoryID
user(a)\connetid=Server(n)\clientid
string$=Str(user(a)\connetid)+"\"+Str(user(a)\targetid)+"\"+Str(user(a)\memory)+"\"
user(a)\thread = CreateThread(@NewConnet(),string$)
Debug "connet"+Str(a)
Else
CloseNetworkConnection(EventClient())
ZeroMemory_(@user(a),SizeOf(LIVEDATA))
EndIf
Next i
Case #PB_NetworkEvent_Disconnect
Debug "no"
Server(n)\event=0
For i=1 To USERNUMBER
If user(i)\connetid=Server(n)\clientid
Debug "lost"+Str(i)
KillThread(user(i)\thread)
FreeMemory(user(i)\memory)
ZeroMemory_(@user(i),SizeOf(LIVEDATA))
EndIf
Next i
EndSelect
Until 0
EndProcedure
;-程序开始
OpenPreferences(#File)
InitNetwork()
For i=1 To 30
PreferenceGroup(Str(i))
Server(i)\port=ReadPreferenceLong("port",0)
Server(i)\targetip=ReadPreferenceString("targetip", "")
Server(i)\targetport=ReadPreferenceLong("targetport",0)
WritePreferenceLong("createok",0)
If Server(i)\port=0 Or Server(i)\targetip="" Or Server(i)\targetport=0
Else
Thread = CreateThread(@main(),i)
EndIf
Next i
ClosePreferences()
start=1
Repeat
Delay(1)
Select NetworkServerEvent()
Case #PB_NetworkEvent_Connect
server=EventServer()
client=EventClient()
For i =1 To 30
If Server(i)\server=server
Server(i)\event=#PB_NetworkEvent_Connect
Server(i)\clientid=client
Break
EndIf
Next i
Case #PB_NetworkEvent_Disconnect
server=EventServer()
client=EventClient()
For i =1 To 10
If Server(i)\server=server
Server(i)\event=#PB_NetworkEvent_Disconnect
Server(i)\clientid=client
Break
EndIf
Next i
EndSelect
Until 0Code: Select all
[1]
createok = 0
port = 9900
targetip = 202.85.27.171
targetport = 3218
[2]
createok = 0
port = 9901
targetip = 222.122.148.250
targetport = 3389
[3]
createok = 0
port = 9902
targetip = 192.168.1.6
targetport = 3389
[4]
createok = 0
port = 9903
targetip = 0
targetport = 0
[5]
createok = 0
port = 9904
targetip = 0
targetport = 0
[6]
createok = 0
port = 9905
targetip = 0
targetport = 0
[7]
createok = 0
port = 9906
targetip = 0
targetport = 0
[8]
createok = 0
port = 9907
targetip = 0
targetport = 0
[9]
createok = 0
port = 9908
targetip = 0
targetport = 0
[10]
createok = 0
port = 9909
targetip = 0
targetport = 0