[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Прослушивание определенного порта
CRTX
Здравствуйте уважаемые эксперты.
Возник вопрос следующего порядка:
Необходимо поставить прослушивание порта (например 7001) на сервере,
чтобы удаленный клиент передавал какую-либо строку на сервер обычной программой (не через браузер)
делаю при помощи сокетов, однако простейшая конструкция такого рода:

$sock = socket_create(AF_INET6, SOCK_STREAM, SOL_TCP);
socket_bind($sock,'10.1.249.145',7001);

if (socket_listen($sock,5) == true){
$cli = socket_accept ($sock);
$str = socket_read($cli,PHP_NORMAL_READ);
socket_close($cli);}
echo $str;

выдает ошибку.
Подскажите пожалуста кто сведущ в этих делах, а то я с сокетами никогда не работал.
Заранее благодарен за все ответы.



Спустя 25 дней, 36 минут, 54 секунды (24.09.2007 - 16:51) LittleFuntik написал(а):
Серверные функции

Рассмотрим поочередно серверные и клиентские функции. Для сервера после создания сокета необходимо связать этот сокет с локальным адресом с помощью функции socket_bind():
int socket_bind(int socket, string address [, int port])


У этой функции три параметра:
созданный с помощью функции socket_create() сокет;
локальный IP-адрес;
порт.


Следующая функция socket_listen() позволяет запустить прослушивание порта, во время которого программа будет ожидать подключения на порт со стороны клиента:
int socket_listen(int socket, int backlog)
Здесь у нас два параметра — созданный сокет и максимальное количество подключений, которые могут находиться в очереди.
Прослушивание началось, и теперь мы готовы принимать подключения клиентов. Вызываем функцию socket_accept (). В этот момент выполнение сценария блокируется до тех пор, пока не будет получено новое соединение. Как только к порту, открытому вашей программой, произошло подключение, функция создает новый сокет и возвращает его дескриптор. Этот сокет никак не связан с тем, который вы создавали при инициализации, а предназначен для обмена данными с клиентом.

--------------------

Вот мини-пример:

Код
set_time_limit (0);
$address = ‘127.0.0.1′;
$port = 80;
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_bind($sock, $address, $port) or die(’Could not bind to address’);
socket_listen($sock);
while(1) {
$client = socket_accept($sock);
$input = socket_read($client, 1024);
echo $input;
socket_write($client, $output);
socket_close($client);
}
socket_close($sock);


Чем смог - тем помог... smile.gif

Спустя 3 года, 1 месяц, 6 дней, 18 часов, 23 минуты, 21 секунда (31.10.2010 - 12:14) Гость_goluzov написал(а):
иньтерес... как сделать одновременную обработку нескольких соединений

Спустя 4 дня, 7 часов, 45 минут, 31 секунда (5.11.2010 - 19:59) Sanchopansa написал(а):
Вот самый яркий пример работы с сокетами который я смог найти.. тут есть так называемая многопоточность...
<?php 
error_reporting(0);
set_time_limit(0);
ini_set("max_execution_time","0");
ini_set("memory_limit","9999M");
ini_set("output_buffering","0");
ini_restore("safe_mode");
ini_restore("open_basedir");
ini_restore("safe_mode_include_dir");
ini_restore("safe_mode_exec_dir");
ini_restore("disable_functions");
ini_restore("allow_url_fopen");
ini_set('error_log',NULL);
ini_set('log_errors',0);
set_magic_quotes_runtime(0);
ignore_user_abort(1);
if(!function_exists("socket_create")) {
trigger_error("Socket: Missing module 'sockets'",E_USER_ERROR);
die();
}
$GLOBALS['bindport'] = (intval($argv[1])?intval($argv[1]):7700);
$server = new server();
class server {
var $listen_addr = "0.0.0.0";
var $listen_port;
var $socket = false;
var $clients;
function server() {
$this->listen_port = $GLOBALS['bindport'];
$this->socket = false;
$this->clients = array();
$this->run();
}
function run() {
if(!($this->socket = @socket_create(AF_INET,SOCK_STREAM,0)))
$this->socket_error();
if(!@socket_setopt($this->socket,SOL_SOCKET,SO_REUSEADDR,1))
$this->socket_error();
if(!@socket_set_nonblock($this->socket))
$this->socket_error();
if(!@socket_bind($this->socket,$this->listen_addr,$this->listen_port))
$this->socket_error();
if(!socket_listen($this->socket))
$this->socket_error();
$abort = false;
while(!$abort) {
$set_array = array_merge(array("server" => $this->socket),$this->get_client_connections());
$set = $set_array;
if(socket_select($set,$set_w = NULL,$set_e = NULL,1,0) > 0) {
foreach($set as $sock) {
$name = array_search($sock,$set_array);
if(!$name) {
continue;
} elseif($name == "server") {
if(!($conn = socket_accept($this->socket))) {
$this->socket_error();
} else {
$clientID = uniqid("client_");
$this->clients[$clientID] = new client($conn);
}
}
else {
$clientID = $name;
if(($read = @socket_read($sock,1024)) === false || $read == '') {
if($read != '')
$this->socket_error();
$this->remove_client($clientID);
} else {
if(strchr(strrev($read),"\n") === false) {
$this->clients[$clientID]->buffer .= $read;
} else {
$this->clients[$clientID]->buffer .= trim($read);
if(!$this->clients[$clientID]->interact()) {
$this->clients[$clientID]->disconnect();
$this->remove_client($clientID);
} else {
$this->clients[$clientID]->buffer = "";
}
}
}
}
}
}
}
}

function get_client_connections() {
$conn = array();
foreach($this->clients as $clientID => $client) {
$conn[$clientID] = $client->connection;
}
return $conn;
}
function remove_client($clientID) {
unset($this->clients[$clientID]);
}
function socket_error() {
trigger_error("Socket error: ".socket_strerror(socket_last_error($this->socket))."\r\n",E_USER_ERROR);
if(is_resource($this->socket))
socket_close($this->socket);
die();
}
}

class client {
var $connection;
var $buffer = '';
function client($connection) {
$this->connection = $connection;
$this->send("\$> ");
}
function interact() {
if(strlen($this->buffer)) {
/* *** */
$command = $this->buffer;
$cmd = explode(" ",strtolower($command));
if($cmd[0] == "logout" || $cmd[0] == "exit" || $cmd[0] == "quit")
return false;
if($cmd[0] == "cd") {
unset($cmd[0]);
if (chdir(implode(" ",$cmd)))
{
$this->send(str_replace("\n","\r\n",str_replace("\r","",'Dir changed to ' . implode(" ",$cmd)))."\r\n\$> ");
} else {
$this->send(str_replace("\n","\r\n",str_replace("\r","",'Can\'t change dir!'))."\r\n\$> ");
}
}

else
$this->send(str_replace("\n","\r\n",str_replace("\r","",$command))."\r\n\$> ");
/* *** */
return true;
}
return $this->return;
}
function disconnect() {
if(is_resource($this->connection))
socket_close($this->connection);
}
function send($str) {
socket_write($this->connection,$str);
}
}

?>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.