Toon posts:

[php]Gebruik raw sockets werkt niet onder Windows 2003

Pagina: 1
Acties:
  • 73 views sinds 30-01-2008

Verwijderd

Topicstarter
Ik gebruik een script om pda toestellen te pingen, dit maakt gebruik van raw sockets, op een Windows XP werkt dit perfect, op een Windows 2003 Server krijg ik echter volgende fout : unable to connect [0]: An attempt was made to access a socket in a way forbidden by its access permissions. in c:\Inetpub\wwwroot\test\ping.php

De enige oplossing die ik bij MS vind is er één voor Windows NT4 :?

Waarschijnlijk moet ik ergens toelating geven voor het gebruik van raw sockets, iemand enig idee waar ?

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Op welke regel zit je error, en plak die regel eens hier, met wat relevante code erbij :)

Going for adventure, lots of sun and a convertible! | GMT-8


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
De error lijkt me vrij duidelijk: de user waaronder de site draait heeft geen rechten om die socket te accessen. Geef de user voldoende rechten (test het desnoods door hem (tijdelijk) administrator te maken).

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Dit is het gebruikte stukje code :

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<?php 

class Net_Ping 
{ 
  var $icmp_socket; 
  var $request; 
  var $request_len; 
  var $reply; 
  var $errstr; 
  var $time; 
  var $timer_start_time; 
  function Net_Ping() 
  { 
   $this->icmp_socket = socket_create(AF_INET, SOCK_RAW, 1); 
   socket_set_block($this->icmp_socket); 
   
      // set the timeout 
   socket_set_option($this->icmp_socket, 
     SOL_SOCKET,  // socket level 
     SO_RCVTIMEO, // timeout option 
     array( 
       "sec"=>2, // Timeout in seconds 
       "usec"=>0  // I assume timeout in microseconds 
       ) 
     ); 

  } 
   
  function ip_checksum($data) 
  { 
     $sum = null;
     for($i=0;$i<strlen($data);$i += 2) 
     { 
         if($data[$i+1]) $bits = unpack('n*',$data[$i].$data[$i+1]); 
         else $bits = unpack('C*',$data[$i]); 
         $sum += $bits[1]; 
     } 
      
     while ($sum>>16) $sum = ($sum & 0xffff) + ($sum >> 16); 
     $checksum = pack('n1',~$sum); 
     return $checksum; 
  } 

  function start_time() 
  { 
   $this->timer_start_time = microtime(); 
  } 
   
  function get_time($acc=2) 
  { 
   // format start time 
   $start_time = explode (" ", $this->timer_start_time); 
   $start_time = $start_time[1] + $start_time[0]; 
   // get and format end time 
   $end_time = explode (" ", microtime()); 
   $end_time = $end_time[1] + $end_time[0]; 
   return number_format ($end_time - $start_time, $acc); 
  } 

  function Build_Packet() 
  { 
   $data = "abcdefghijklmnopqrstuvwabcdefghi"; // the actual test data 
   $type = "\x08"; // 8 echo message; 0 echo reply message 
   $code = "\x00"; // always 0 for this program 
   $chksm = "\x00\x00"; // generate checksum for icmp request 
   $id = "\x00\x00"; // we will have to work with this later 
   $sqn = "\x00\x00"; // we will have to work with this later 

   // now we need to change the checksum to the real checksum 
   $chksm = $this->ip_checksum($type.$code.$chksm.$id.$sqn.$data); 

   // now lets build the actual icmp packet 
   $this->request = $type.$code.$chksm.$id.$sqn.$data; 
   $this->request_len = strlen($this->request); 
  } 
   
  function Ping($dst_addr,$timeout=5,$percision=3) 
  { 
   // lets catch dumb people 
   if ((int)$timeout <= 0) $timeout=5; 
   if ((int)$percision <= 0) $percision=3; 
    

   if ($dst_addr) 
   { 
     if (socket_connect($this->icmp_socket, $dst_addr, NULL)) 
     { 
      
     } else { 
       $this->errstr = "Cannot connect to $dst_addr"; 
       return FALSE; 
     } 
     $this->Build_Packet(); 
     $this->start_time(); 
     socket_write($this->icmp_socket, $this->request, $this->request_len); 
     if (socket_recv($this->icmp_socket, $this->reply, 256, 0)) 
     { 
       $this->time = $this->get_time($percision); 
       return $this->time; 
     } else { 
         $this->time = 0;
       $this->errstr = "Timed out"; 
       return FALSE; 
     } 
     socket_close($this->icmp_socket);
   } else { 
     $this->errstr = "Destination address not specified"; 
     return FALSE; 
   } 
  } 
} 

    $ping = new Net_Ping; 
    
    $ping->ping("10.1.10.5",10); 
    
    if ($ping->time) 
      echo "Time: ".$ping->time . "<br />\n"; 
    else 
      echo $ping->errstr . "<br />\n"; 
      
?>


De fout doet zich voor bij de socket_connect ( lijn 86 )

PHP:
1
    if (socket_connect($this->icmp_socket, $dst_addr, NULL))


Waar vind ik terug onder welke gebruiker de site draait ?
Ik heb aan de standaard instellingen bij installatie van PHP niks gewijzigd, dus ik veronderstel dat de gebruiker dezelfde is op mijn Windows XP machine, als op de Windows 2003, maar misschien heeft die op de Windows 2003 minder rechten, of is dit een iis instelling ?

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 00:19
Join the club...
Ik zit ook al maanden met het probleem

Ben bang dat de enige oplossing is om PING.exe aan te roepen.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 05 juni 2007 @ 09:49:
Waar vind ik terug onder welke gebruiker de site draait ?
Verdiep je eens in de materie in plaats van setup, next, next, next te rossen?
Die user vind je hier terug. Maar dat is natuurlijk ook prima te googlen; een beetje inzet is toch wel het minst wat we van je verwachten.
Verwijderd schreef op dinsdag 05 juni 2007 @ 09:49:
Ik heb aan de standaard instellingen bij installatie van PHP niks gewijzigd, dus ik veronderstel dat de gebruiker dezelfde is op mijn Windows XP machine
Ik mag hopen van niet :D Als de gebruiker admin is is je web-gebruiker ook admin :D
(oh, wacht, je bedoelt hetzelfde is onder XP en W2K3. Ja, dat klopt. Ik dacht als de aangemelde gebruiker ;) )
Verwijderd schreef op dinsdag 05 juni 2007 @ 09:49:
als op de Windows 2003, maar misschien heeft die op de Windows 2003 minder rechten, of is dit een iis instelling ?
De user die IIS default gebruikt is erg beperkt in rechten ja; daarom gaf ik al aan dat je eens kunt proberen (voor de test) om die user tijdelijk admin te maken (effe IIS restarten to be sure) om te zien of het dan wel werkt. Als dat niet werkt kon het wel eens goed zijn dat die user vanaf W2K3 dat soort kunstjes helemaal niet meer mag uithalen.

Sterker: voor zover ik begrijp zou het onder XP SP2 ook niet (meer) moeten werken.

[ Voor 6% gewijzigd door RobIII op 05-06-2007 10:50 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:32

Janoz

Moderator Devschuur®

!litemod

Tja, een beetje kant en klare code van http://www.raxnet.net/ downloaden en dan hier komen leuren om het werkend te krijgen is niet de bedoeling van dit programmeer forum. De foutmelding is duidelijk, het probleem lijkt me duidelijk en ook de oplossing lijkt me zo niet in de php code liggen.

Verdiep je eens in de materie, zorg dat je je server kunt configureren voor de dingen die je er mee wilt doen of huur daarvoor maar iemand in. Dit topic gaat iig op slot omdat het helemaal niks meer met programmeren te maken heeft.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1

Dit topic is gesloten.