2010-11-09 2 views
1

Как получить и отправить данные через один и тот же сокет с PHP? У меня есть этот код:PHP GET и POST данные с fsockopen

$fp = fsockopen("ssl://ovi.rdw.nl", 443, $errno, $errstr, 30); 
if(!$fp){ 
    echo $errstr; 
}else{ 
$post_data = 'ctl00$cntMaincol$btnZoeken=Zoeken&ctl00$cntMaincol$txtKenteken=83FHVN'; 

$out = "GET /Default.aspx HTTP/1.0\r\n"; 
$out .= "Host: ovi.rdw.nl\r\n"; 
$out .= "Connection: Close\r\n\r\n"; 
fwrite($fp, $out); 

while(!feof($fp)){ 
    $data = fgets($fp); 
    $view_state = getViewState($data); 
    if($view_state != ""){ 
     echo $view_state."<br />"; 
     break; 
    } 
} 

$post_data = "__VIEWSTATE={$view_state}&".$post_data; 

$out = "POST /Default.aspx HTTP/1.0\r\n"; 
$out .= "Host: ovi.rdw.nl\r\n"; 
$out .= "Content-type: application/x-www-form-urlencoded\r\n"; 
$out .= "Content-length: " . strlen($post_data) . "\r\n"; 
$out .= "Connection: Close\r\n\r\n"; 
fwrite($fp, $out); 
fwrite($fp, $post_data); 
while(!feof($fp)){ 
    echo fgets($fp); 
} 
} 

Это данные прямо, но публикация идет не так. Что я делаю?

ответ

0

не забудьте fflush()

+0

Для того, что использование было бы? –

+0

сбрасывает любые буферизованные данные через поток. –

1

Вы делаете GET и POST в том же соединении, это не распространяется на HTTP/1.0, который Вы указали и вновь заверили через соединение: близко. Прокомментируйте свою часть получения и просто сделайте сообщение.

Вы можете получить данные обратно с сообщением, так что вам не нужно делать получение и сообщение. Или, если вам нужно сделать запрос и сообщение, закройте сокет, затем снова заново установите сокет для сообщения.

+0

Мне нужно, чтобы firts сделал get, чтобы получить значение $ view_state, иначе оно будет пустым. Когда я повторно атакую ​​новое соединение, $ view_state будет отличаться, так что это не поможет. –

+0

Затем после GET закройте сокет и откройте другое соединение для POST. Соединение должно быть сброшено после того, как ваш буфер будет опущен, а ваше сообщение будет проигнорировано. – superfro

+0

Упс, перечитайте свою статуту. Ну, если у вас должно быть такое же соединение, вам нужно переключиться на http 1.1 и использовать постоянные соединения через Connection: Keep-Alive вместо соединения: закрыть – superfro

0

Curl является слишком тяжелым в некоторых случаях, использовать post_to_host():

//GET: 
$str_rtn=post_to_host($str_url_target, array(), $arr_cookie, $str_url_referer, $ref_arr_head, 0); 

//POST: 
$arr_params=array('para1'=>'...', 'para2'=>'...'); 
$str_rtn=post_to_host($str_url_target, $arr_params, $arr_cookie, $str_url_referer, $ref_arr_head); 

//POST with file: 
$arr_params=array('para1'=>'...', 'FILE:para2'=>'/tmp/test.jpg', 'para3'=>'...'); 
$str_rtn=post_to_host($str_url_target, $arr_params, $arr_cookie, $str_url_referer, $ref_arr_head, 2); 

//raw POST: 
$tmp=array_search('uri', @array_flip(stream_get_meta_data($GLOBALS[mt_rand()]=tmpfile()))); 
$arr_params=array('para1'=>'...', 'para2'=>'...'); 
file_put_contents($tmp, json_encode($arr_params)); 
$arr_params=array($tmp); 
$str_rtn=post_to_host($str_url_target, $arr_params, $arr_cookie, $str_url_referer, $ref_arr_head, 3); 

//get cookie and merge cookies: 
$arr_new_cookie=get_cookies_from_heads($ref_arr_head)+$arr_old_cookie;//don't change the order 

//get redirect url: 
$str_url_redirect=get_from_heads($ref_arr_head, 'Location'); 

пост пройдет местоположение проекта PHP: http://code.google.com/p/post-to-host/

Смежные вопросы