NetworkServerEvent() help!

Just starting out? Need help? Post your questions and find answers here.
end7
User
User
Posts: 10
Joined: Thu Jun 01, 2006 9:07 am

NetworkServerEvent() help!

Post by end7 »

CreateNetworkServer() create ten ports(9900-9910). some clients conneted 9900,some clients conneted 9901....,then the connetion lost,i use the NetworkServerEvent(),but it can't get all #PB_NetworkEvent_Disconnect

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 0
the Setdata.ini

Code: 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