【问题标题】:Send TCP packet in PHP在 PHP 中发送 TCP 数据包
【发布时间】:2015-04-10 03:02:38
【问题描述】:

我尝试使用 php 将 TCP 打包数据发送到某个 ip,我使用下面的代码发送它:

$socket=socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    //$bind=socket_bind($socket,'tcp://94.232.171.102');

socket_connect($socket, 'xx.xx.xx.xx', 9001);
$buff='P\00\00\00\e5G\1f\b9\c6\acB\84\15\e7\b3*\17\ab\00G2\n\9c\ba{\a9}\dab"\c31\ed\f7\94\fc\aeX\ab\13\r/\02\ce\83f\bc?\96q\10M\b0\f4\a0\b1\95X\d0\85\10\df$|\de$\b4\f6m\a9\ff%Z\b4\d8\aa\da\bb';
$length = strlen($buff);
$sent = socket_write($socket, $buff, $length);

但是,但是,它不起作用并且不发送,当我使用一些 Windows 应用程序(如 Packet Sender)进行该设置时,它可以正确发送数据包,为什么我不能从本地主机上的 php 发送它

【问题讨论】:

  • 您能否更具体地说明问题所在? $sent 的值是多少?你期待什么?如果有的话,会发送什么?
  • 发送的答案是数字 198,当它正常工作时,它必须在 Web 应用程序上工作,但它不适用于 php 代码,但可以通过具有相同设置的数据包发送应用程序正确工作
  • 那么实际的问题是什么?那么,$sent 应该是 198,而实际上是?
  • 问题是这段代码在现实世界中没有做任何动作(我的网络应用程序监听这个端口并接收数据)但是如果我使用这个设置和数据包发送者它工作得很好......跨度>
  • 我们一定是在互相交谈。当你运行这段代码时,我仍然不知道$sent 有什么价值,尽管我已经问过你两次了。

标签: php sockets tcp websocket


【解决方案1】:

通过至少一些错误处理,您更有可能找到错误。

ini_set('display_errors', true); error_reporting(E_ALL); // <- for debugging purposes only

$socket=socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ( !$socket ) {
    $errno = socket_last_error();
    $error = sprintf('%s (%d)', socket_strerror($errno), $errno);
    trigger_error($error, E_USER_ERROR);
}

if ( !socket_connect($socket, 'xx.xx.xx.xx', 9001) ) {
    $errno = socket_last_error($socket);
    $error = sprintf('%s (%d)', socket_strerror($errno), $errno);
    trigger_error($error, E_USER_ERROR);
}

$buff='P\00\00\00\e5G\1f\b9\c6\acB\84\15\e7\b3*\17\ab\00G2\n\9c\ba{\a9}\dab"\c31\ed\f7\94\fc\aeX\ab\13\r/\02\ce\83f\bc?\96q\10M\b0\f4\a0\b1\95X\d0\85\10\df$|\de$\b4\f6m\a9\ff%Z\b4\d8\aa\da\bb';
$length = strlen($buff);
$sent = socket_write($socket, $buff, $length);
if ( FALSE===$sent ) {
    $errno = socket_last_error($socket);
    $error = sprintf('%s (%d)', socket_strerror($errno), $errno);
    trigger_error($error, E_USER_ERROR);
}
else if ( $length!==$sent ) {
    $msg = sprintf('only %d of %d bytes sent', $length, $sent);
    trigger_error($msg, E_USER_NOTICE);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 2017-09-14
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多