PHP套接字包数据

时间:2018-06-22 09:30:22

标签: php sockets imap pack

<?php

$desthost = "imap.gmail.com";
$port     = 993;
$conflag  = STREAM_CLIENT_CONNECT;

try
{
    $socket = stream_socket_client( "tcp://host:port", $errno, $errstr, 15, $conflag );

    fwrite( $socket, pack( "C3", 0x05, 0x01, 0x00 ) );
    $server_status = fread( $socket, 2048 );
    if ( $server_status == pack( "C2", 0x05, 0x00 ) )
    {
        // Connection succeeded
    }
    else
    {
        die( "SOCKS Server does not support this version and/or authentication method of SOCKS.\r\n" );
    }

    fwrite( $socket, pack( "C5", 0x05, 0x01, 0x00, 0x03, strlen( $desthost ) ) . $desthost . pack( "n", $port ) );
    $server_buffer = fread( $socket, 10 );

    var_dump(unpack("C5", $server_buffer));


    if ( ord( $server_buffer[0] ) == 5 && ord( $server_buffer[1] ) == 0 && ord( $server_buffer[2] ) == 0 )
    {
        // Connection succeeded
    }
    else
    {
        die( "The SOCKS server failed to connect to the specificed host and port. ( " . $desthost . ":" . $port . " )\r\n" );
    }

    stream_socket_enable_crypto( $socket, TRUE, STREAM_CRYPTO_METHOD_SSLv23_CLIENT );
}
catch ( Exception $e )
{
    die( $e->getMessage() );
}

if ( $socket === FALSE )
{
    die( "bad socket" );
}

//fwrite( $socket, "GET /\n" );
echo fread( $socket, 8192 );

此代码连接到代理,并通过代理连接到imap。我不明白这个包是如何工作的?

什么意思是fwrite($ socket,pack(“ C3”,0x05,0x01,0x00)); ?

下一个代码是什么意思?

fwrite( $socket, pack( "C5", 0x05, 0x01, 0x00, 0x03, strlen( $desthost ) ) . $desthost . pack( "n", $port ) );

我认为它是“ CONNECT host:port”?有人可以向我解释一下吗?当我尝试发送命令“ 0000001 LOGIN login pass”时,imap向我返回错误的错误语法。似乎我应该打包此命令或类似的东西。

1 个答案:

答案 0 :(得分:1)

https://en.wikipedia.org/wiki/SOCKS上有SOCKS协议的概述。

这是一些肮脏的代码,可以快速连接到SOCKS代理。

fwrite( $socket, pack( "C3", 0x05, 0x01, 0x00 ) );表示发送字节5、1和0。

在初始连接请求中,这意味着支持“ SOCKS版本5”,1身份验证方法,而其中一种身份验证方法为No authentication

if ( $server_status == pack( "C2", 0x05, 0x00 ) )正在检查服务器是否响应“袜子版本5,请使用No Authentication”。

fwrite( $socket, pack( "C5", 0x05, 0x01, 0x00, 0x03, strlen( $desthost ) ) . $desthost . pack( "n", $port ) );正在发送连接请求:

  • 5(SOCKS版本5)
  • 1(TCP连接请求)
  • 0(保留)
  • 3(使用域名)
  • length的域名
  • 域名
  • 以网络字节顺序排列的端口号

if ( ord( $server_buffer[0] ) == 5 && ord( $server_buffer[1] ) == 0 && ord( $server_buffer[2] ) == 0 )正在检查服务器响应。

  • 5个袜子版本5
  • 0个请求已批准
  • 0个保留字节。

还有更多字段,但它会忽略它们,希望它们完全适合10个字节,如果它返回域地址或IPv6地址,则可能不正确。

此时,与远程服务器的连接已建立。然后将其升级到TLS,否则应能按预期工作。

对于此后的IMAP命令,请确保它们以“ \ r \ n”结尾。您实际上并没有显示您的代码,因此我们无法帮助调试它。

SOCKS5在RFC1928中正式指定。