Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] weigert socket aan IPv6 te binden

Pagina: 1
Acties:

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 00:04
Geachte GoT'ters,

Al een tijdje ben ik bezig om meerdere IPv6-adressen goed en correct werkend te krijgen op een Windows Server 2012-machine. Een VPS bij TransIP in dit geval.

Nu draait daar een PHP-script op wat sockets gebruikt. Sockets kunnen aan een IP gebonden worden zodat de requests van verschillende IPs komen. Het probleem is alleen dat alleen het 1e IP in de IPv6-config (bij Eigenschappen van Netwerkadapters) wordt gebruikt door PHP. Het volgende bedoel ik:
Afbeeldingslocatie: http://i.imgur.com/O2gH1gU.png

Het ligt zeer waarschijnlijk aan de instellingen, aangezien het bij IPv4 wel perfect lukt en naar mijn weten PHP geen bug heeft dat het niet kan binden. Het kan immers binden aan een IPv6, weliswaar de eerste - maar het kan wel.
Code die wordt gebruikt voor het binden:
PHP:
1
2
$context = stream_context_create ();
stream_context_set_option ($context, 'socket', 'bindto', $this -> connectionInfo ['bind_ip']);

Er stond hier nog een if met filter_var en FILTER_VALIDATE_IP die faalde, maar het weghalen lostte helaas niks op.

Iemand die hier voor mij iets richting een oplossing weet.

(N.B.: Dit heb ik ook al lopen bij een TransIP-ticket, ik probeer antwoorden daarvan hier neer te zetten waar mogelijk/nodig.)

[ Voor 13% gewijzigd door Xanland op 31-08-2013 02:23 ]

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


  • gertvdijk
  • Registratie: November 2003
  • Laatst online: 17:15
Waar is het meest essentiële uit je post? De PHP code...

"Hij doet het niet" zonder te laten zien wat je probeert... ;)

Kia e-Niro 2021 64kWh DynamicPlusLine. 3x Victron MP-II op 15kWh US5000 3f thuisbatterij met 3x25A→3x40A PowerAssist, Victron EVCS, 3200Wp HoyMiles zp. my GitHub, my blog


  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 00:04
Code die wordt gebruikt voor het binden:
PHP:
1
2
$context = stream_context_create ();
stream_context_set_option ($context, 'socket', 'bindto', $this -> connectionInfo ['bind_ip']);

Er stond hier nog een if met filter_var en FILTER_VALIDATE_IP die faalde, maar het weghalen lostte helaas niks op.

Zie ook de post. :+

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


  • Miepermans
  • Registratie: Oktober 2004
  • Niet online

Miepermans

BIEM!

connectionInfo ['bind_ip'], moet dat niet :
connectionInfo['bind_ip'] zijn ? en zelfs misschien wel
$connectionInfo['bind_ip']

  • Equator
  • Registratie: April 2001
  • Laatst online: 13:28

Equator

Crew Council

#whisky #barista

Tja, ik zie even niet in wat dit verder met netwerken te maken heeft :)
Ik neem aan dat het IPv6 adres wel te pingen is vanaf een andere pc? Dan is er netwerktechnisch dus niets aan de hand.

De spatie achter connectionInfo moet sowieso weg. Ik weet niet of dat een typo is. Wat is de warning/melding die PHP geeft?

Ik verplaats dit topic naar Programming :)

[ Voor 9% gewijzigd door Equator op 31-08-2013 09:06 ]


  • Snow_King
  • Registratie: April 2001
  • Laatst online: 16:22

Snow_King

Konijn is stoer!

Wat gebeurd er precies als je aan het 2e danwel 3e IP wil binden? Krijg je een warning van PHP?

  • ThomasG
  • Registratie: Juni 2006
  • Laatst online: 17:12
Hoe heb je het IP adres opgegeven? Volgens de PHP documentatie moet je een IPv6 manier anders behandelen dan IPv4.
Note: When specifying a numerical IPv6 address (e.g. fe80::1), you must enclose the IP in square brackets—for example, tcp://[fe80::1]:80.
PHP.net: stream_socket_server

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 00:04
De PHP-code is het probleem niet. Die spatie is gewoon toegestaan want het werkt ook met IPv4. Daarnaast is die connectionInfo een property van een class.

Het IPv6-IP staat trouwens tussen blokhaken zoals hierboven aangegeven.

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


  • Pizzalucht
  • Registratie: Januari 2011
  • Laatst online: 15:03

Pizzalucht

Snotneus.

Is je IP wel valid? Aangezien je filter_var niet langs kwam, terwijl FILTER_VALIDATE_IP gewoon ipv6 herkent.

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 00:04
Het IP is inderdaad wel valid. filter_var houdt geen rekening met de case dat een IPv6 omringd is met blokhaken, dit vereist dan ook een aanpassing in de code.

De hoster zegt trouwens dat ik het verkeerd heb ingevuld, maar het 1e IPv6 werkt gewoon.Denk zeer waarschijnlijk ook dat het daar niet aan ligt.

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 00:04
Bump, iemand nog ideeën hierover?

Zit nog steeds met hetzelfde probleem bij de/een, inmiddels andere, hostingpartij. Overstap had andere reden.. :P

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Zou een IP als '[::]' niet als global werken? Dat moet overeenkomen met het globale bind ip '0.0.0.0' in IPv4.

Worth a shot zou ik zeggen, maar misschien heb je het al geprobeerd.

edit:

Ah ik zie dat '0.0.0.0' overeenkomt met de C INADDR_ANY, even googlen op IPv6 INADDR_ANY levert mij 'IN6ADDR_ANY_INIT' op, wat inderdaad [::] zou moeten zijn.

http://lxr.free-electrons.../linux/in6.h?v=2.6.33#L47

[ Voor 40% gewijzigd door HMS op 08-09-2013 01:30 ]


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Xanland schreef op zondag 08 september 2013 @ 01:21:
Bump, iemand nog ideeën hierover?

Zit nog steeds met hetzelfde probleem bij de/een, inmiddels andere, hostingpartij. Overstap had andere reden.. :P
Ik mis nog steeds een volledig uitgewerkte, maar uitgeklede testcase, waarin je desnoods alles hardcoded erin stopt. Elke suggestie kap je af met dat je dat al hebt (geprobeerd).

Daarnaast mis ik nog even of je verder nog ergens foutmeldingen hebt staan :)

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 00:04
Een volledige testcase zou ik wel willen doen, maar het betreft in dit geval een IRC-bot (van een/twee user(s) van hier).

Aangezien het als een heel framework (class-based dus/in dit geval) is opgebouwd wordt het naar ik ben bang nogal lastig om dit even snel en simpel in een testcase uit te werken. Zelf werk ik voor de testcase al met een verse SVN-checkout er van, maar het is en blijft verrekte lastig.

Plus het feit dat ik sockets en/of IRC niet echt makkelijk te debuggen vind.

Foutmeldingen komen niet voor, behalve de ene keer dat er geen verbinding kon worden gemaakt en de andere keer gewoon niks maar ook geen verbinding.

[ Voor 21% gewijzigd door Xanland op 08-09-2013 01:50 ]

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


  • HMS
  • Registratie: Januari 2004
  • Laatst online: 17-11 00:33

HMS

Mijn suggestie om als bind ip '[::]' te gebruiken werkte ook niet?

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 00:04
Helaas niet, zelfs null - wat ook nog kan - hetzelfde verhaal.

Code waarop het al fout loopt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$context = stream_context_create ();
$scheme  = 'tcp';
                
stream_context_set_option ($context, 'socket', 'bindto', '[ipv6-ip-eigen-vps]');
                
if ($this -> connectionInfo ['secure'] === true && extension_loaded ('openssl'))
{
        stream_context_set_option ($context, array
        (
                'ssl' => array
                (
                        'verify_peer'           => false,
                        'allow_self_signed'     => true,
                        'local_cert'            => __DIR__ . '/nuwani.pem',
                        'passphrase'            => ''
                )
        ));
        
        $scheme = 'ssl';
}
                
$this -> socket = @ stream_socket_client
(
        $scheme . '://[2a01:4f8:a1:221::3]:6697', // IPv6 van irc.gtanet.com met 6697 SSL connectie (wordt ondersteund en werkt ook bij IPv4)
        $errorNumber,
        $errorString,
        2.0,
        STREAM_CLIENT_CONNECT,
        $context
);


Een socket_last_error van $this->socket levert al een fout op dat $this->socket een boolean is. Dit zou uiteraard een socket stream moeten zijn.

(Komt btw van het Nuwani-v2 framework, mocht iemand geïnteresseerd zijn. Geen relatie tussen mij en het project, behalve dat ik het gebruik.)

[ Voor 15% gewijzigd door Xanland op 08-09-2013 02:56 ]

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


Verwijderd

Haal die @ daar sowieso eens weg. Fouten onderdrukken is niet zo handig als je op zoek bent naar bugs.

  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 00:04
Ahja, goeie. Heb de @ inderdaad weggehaald. Gebruik ze zelf niet vaak dus daarom er niet meer aan gedacht.

Wanneer die @ weg is krijg ik de volgende error:
code:
1
2
3
4
ne 234: "stream_socket_client(): unable to connect to ssl://[2a01:4f8:a1:221::3]
:6697 (A connection attempt failed because the connected party did not properly
respond after a period of time, or established connection failed because connect
ed host has failed to respond.

wat ik heel vreemd vind. Ik heb namelijk wel een aantal keer via precies dezelfde instellingen verbinding kunnen maken...

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P


  • Xanland
  • Registratie: Oktober 2007
  • Laatst online: 00:04
Bumpje again!

Helaas constanteer ik net een ander probleem: Op dit moment probeer ik te pingen naar een IRC-server die IPv6 ondersteunt, met het volgende commando:
ping -6 -S 2a02:348:87:3135::2 irc.gtanet.com

-6 forceerd uiteraard IPv6 en -S geef je een IPv6 mee aan waarvandaan je wil pingen. Het bovenstaande commando geeft een packet loss van 100%. Dit gebeurt ook met 2a02:348:87:3135::2, die ook is toegevoegd via advanced. Wel kan ik met 2a02:348:87:3135::1 er naar toe pingen (die zonder advanced ingesteld is) met een packet loss van 0% of 25%.

Wat kan hiervan het probleem zijn? Moet ik toevallig nog iets in de firewall hierover inschakelen of is er iets anders wat ik over het hoofd zie. Als ik de volgorde verander en dus bijvoorbeeld 2a02:348:87:3135::2 als eerste staat kan ik daarvandaan goed pingen, maar de andere hebben dan nog steeds 100% packet loss.

[ Voor 97% gewijzigd door Xanland op 11-09-2013 12:39 ]

RobIII: Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P

Pagina: 1