通过 tcp 套接字发送十六进制值

Posted

技术标签:

【中文标题】通过 tcp 套接字发送十六进制值【英文标题】:Sending Hex values over tcp socket 【发布时间】:2017-03-26 17:18:48 【问题描述】:

我有以下 python 代码,用于使用 TCP 套接字将十六进制数据发送到网络设备,它工作正常

import socket
import binascii

def Main():
    host = '192.168.2.3'
    port = 8000

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))
    print 'connected'
    message = '\x00\x01\x02\x01\x00\x12\x03\x6b\xd6\x6f\x01\x01\x00\x00\x02\x58\x69\x47\xae\x58\x69\x47\xae\x00'
    s.send(message)
    print 'sent command'

    data = s.recv(1024)
    s.close()
    print type(data)

    print binascii.hexlify(data)

if __name__ == '__main__':
    Main()

但是我需要将此代码转换为 php 并且 我不知道这是否是在 PHP 中表示十六进制数据的正确方法 我尝试运行以下代码

<?php

if(!($sock = socket_create(AF_INET, SOCK_STREAM, getprotobyname("tcp"))))

    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Couldn't create socket: [$errorcode] $errormsg \n");


echo "Socket created \n";

//Connect socket to remote server
if(!socket_connect($sock , '192.168.2.3' , 8000))

    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Could not connect: [$errorcode] $errormsg \n");


echo "Connection established \n";
//Is this proper representation of the hexadecimal data
$message = '\x00\x01\x02\x01\x00\x12\x03\x6b\xd6\x6f\x01\x01\x00\x00\x02\x58\x26\x17\xf2\x58\x69\x47\xae\x00';

//Send the message to the server
if( ! socket_send ( $sock , $message , strlen($message) , 0))

    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Could not send data: [$errorcode] $errormsg \n");


echo "Message send successfully \n";

//Now receive reply from server
if(socket_recv ( $sock , $buf , 2 , MSG_WAITALL ) === FALSE)

    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Could not receive data: [$errorcode] $errormsg \n");


//print the received message
echo $buf;

与设备成功建立连接,但未向设备发送正确的数据,否则我会收到设备的响应。

提前致谢。

【问题讨论】:

【参考方案1】:

尝试使用 hex2bin 函数发送数据:

$message = hex2bin('000102010012036bd66f0101000002582617f2586947ae00');

【讨论】:

【参考方案2】:

而不是写

$message='\x00\x01\x02\x01\x00\x12\x03\x6b\xd6\x6f\x01\x01\x00\x00\x02\x58\x26\x17\xf2\x58\x69\x47\xae\x00';

您可以只使用 0x 并编写您的十六进制请求:

$message='0x 000102010012036bd66f0101000002582617f2586947ae00';

【讨论】:

以上是关于通过 tcp 套接字发送十六进制值的主要内容,如果未能解决你的问题,请参考以下文章

如何在jmeter tcp采样器中发送多个十六进制数据有效负载?

在 C/C++ 中处理十六进制值

在Objective C(可可)中将十六进制数据字符串转换为NSData

通过野兽网络套接字发送二进制数据(在 C++ 中)

Java TCP socket通信,如何实现发送十六进制值,并在数据接收窗口中显示这些数据对应的字符串,非常感谢!

如何通过套接字发送/接收二进制数据?