Verfasst: 18.07.2007 18:42
So, ich habe nun einen weiteren Code geschrieben. Dieser versucht eine Verbindung zum Server direkt über die WinAPI herzustellen und beendet anschließend die Verbindung gleich wieder. Konnte die Verbindung erfolgreich hergestellt werden, wird die Verbindung erneut mit der PB-Funktion hergestellt.
Mfg DerProgger
Code: Alles auswählen
EnableExplicit
InitNetwork()
Procedure OpenNetworkConnectionEx(ServerName.s,Port.l,TimeOut.l,Type.l = #PB_Network_TCP)
Protected WSAD.WSADATA, TV.TIMEVAL, Addr.SOCKADDR_IN, *HostInfo.HOSTENT, Write_FD.FD_SET
Protected S.l, Switch.l, Retval.l, ServerIP.s
TV\tv_sec = TimeOut
Switch = #True
If Type = #PB_Network_UDP
ProcedureReturn OpenNetworkConnection(ServerName,Port,#PB_Network_UDP)
EndIf
If WSAStartup_($202,@WSAD)
ProcedureReturn #False
EndIf
*HostInfo = gethostbyname_(@ServerName)
If *HostInfo
ServerIP = StrU(PeekB(PeekL(*HostInfo\h_addr_list)),0) + "."
ServerIP + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 1),0) + "."
ServerIP + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 2),0) + "."
ServerIP + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 3),0)
EndIf
S = SOCKET_(#AF_INET,#SOCK_STREAM,#IPPROTO_TCP)
If S = #SOCKET_ERROR
WSACleanup_()
ProcedureReturn #False
EndIf
ioctlsocket_(S,#FIONBIO,@Switch)
With Addr
\sin_addr = inet_addr_(ServerIP)
\sin_port = htons_(Port)
\sin_family = #AF_INET
EndWith
connect_(S,@Addr,SizeOf(Addr))
With Write_FD
\fd_count = 1
\fd_array[0] = S
EndWith
Repeat
Retval = select_(0,0,@Write_FD,0,@TV)
Until Retval >= 0
closesocket_(S)
WSACleanup_()
If Retval
ProcedureReturn OpenNetworkConnection(ServerName,Port)
EndIf
EndProcedure
#TimeOut = 1 ; in Sekunden
Define ID.l = OpenNetworkConnectionEx("www.purebasic.com",80,#TimeOut)
If ID
Debug "Verbindung war erfolgreich"
CloseNetworkConnection(ID)
Else
Debug "Timeout oder Fehler"
EndIf