簡體   English   中英

PHP套接字包數據

[英]PHP socket pack data

<?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向我返回錯誤的錯誤語法。 似乎我應該打包此命令或類似的東西。

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 ) )正在檢查服務器是否響應“ Socks版本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中正式指定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM