如何在侦听器脚本中不断解析UDP数据包并发送到SQL数据库


How to continually Parse UDP packets and send to SQL DB in a listener script

我有一个服务器端脚本,它不断侦听UDP数据。这里有一个简单的PHP版本(在线):

<?php
//Reduce errors
error_reporting(~E_WARNING);
//Create a UDP socket
if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0)))
  {
  $errorcode = socket_last_error();
  $errormsg = socket_strerror($errorcode);
  die("Couldn't create socket: [$errorcode] $errormsg 'n");
  }
echo "Socket created 'n";
// Bind the source address
if( !socket_bind($sock, "0.0.0.0" , 9999) )
  {
  $errorcode = socket_last_error();
  $errormsg = socket_strerror($errorcode);
  die("Could not bind socket : [$errorcode] $errormsg 'n");
  }
echo "Socket bind OK 'n";
//Do some communication, this loop can handle multiple clients
while(1)
  {
  echo "Waiting for data ... 'n";
  //Receive some data
  $r = socket_recvfrom($sock, $buf, 512, 0, $remote_ip, $remote_port);
  echo "$remote_ip : $remote_port -- " . $buf;
  //Send back the data to the client
  socket_sendto($sock, "OK " . $buf , 100 , 0 , $remote_ip , $remote_port);
  }
socket_close($sock);

我还用Perl编写了一个脚本,它也做同样的事情。我想解析UDP消息并将它们存储在SQL数据库中。UDP数据结构基本上遵循这种格式;[var1_ID][var1_value],[var2_ID][var2_value],。。。这个结构看起来很容易解析,但我还没能实例化变量。任何帮助或代码响应都将不胜感激,谢谢!

您听说过解压函数吗?

在不了解更多关于数据包格式的信息的情况下(如果你给我C结构信息,我可以帮你把它转换成一个解压的可解析字符串。),我帮不了你多少忙,但你会想看看pack函数,了解如何快速解析这些信息的值。它确实使用了相同的SETUP a perl,所以您应该对如何开箱即用有一些想法。

顺便说一下,套接字并不总是可用的,但流是可用的。在可移植代码方面,使用流函数而不是套接字函数可能会更好。这是一样的,但PHP有一个内置的接口,套接字函数是事后才加上的。(如果./configure没有显式启用任何功能,那么您仍然可以获得流函数,但不会获得套接字函数。)