Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Асинхронный TCP сервер
DarkSeller  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 5
Пользователь №: 30735
На форуме: 4 года, 11 месяцев, 29 дней
Карма:




Всем привет. Если вас не затруднит, можете дать код неблокирующего TCP сокета-сервера, который отсылает обратно то, что ему прислали? В гугле не -нашёл только клиентские сокеты, но это не то
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
caballero  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1674
Пользователь №: 29588
На форуме: 5 лет, 2 месяца, 24 дня
Карма: 40




неблокирующего что? Почему TCP сервер должен что то блокировать
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
DarkSeller  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 5
Пользователь №: 30735
На форуме: 4 года, 11 месяцев, 29 дней
Карма:




ну, чтобы к нему могли подключаться одновременно несколько клиентов
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
DarkSeller  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 5
Пользователь №: 30735
На форуме: 4 года, 11 месяцев, 29 дней
Карма:




всем спасибо. нашёл
http://i-novice.net/sokety-v-php/
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
inpost  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Помагите Здесь живу!!!
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 22693
Пользователь №: 20039
На форуме: 7 лет
Карма: 599




DarkSeller
node.js + socket.io, сокеты серверные + кроссплатформенные.


--------------------
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
PMПисьмо на e-mail пользователюICQ
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
caballero  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 1674
Пользователь №: 29588
На форуме: 5 лет, 2 месяца, 24 дня
Карма: 40




Цитата
ну, чтобы к нему могли подключаться одновременно несколько клиентов

К любому TCP серверу может подключатся много клиентов - например у к апачу к которыму ты щас подключаешся.
Потрудись в следующий раз внятно сформулировать чего хочешь.
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
I++  
[x]    Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Здесь живет
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 894
Пользователь №: 30580
На форуме: 5 лет, 13 дней
Карма: 43




Говнокод
 |
\|/

http://i-novice.net/sokety-v-php/


1. Отсутствует буферизация чтения, во временную переменную. (Данные могут приходить не целиком, а кусками, их нужно класть во временную переменную, после чего разбивать по спецсимволу.)
2. Отсутствует буферизация записи в сокет. (Сокет не обязан записать все данные, он может записать 1 байт из 100000000000 байтов, которые ему дали, а так как сокет не блокирующий, к тому времени еще данные на запись появляются. Требуется стек.)
3. Нету отлова WSAEWOULDBLOCK и других прелестей.
4. Отсутствие полной проверки на ошибки, в том числе через сокгетопт SO_ERROR. Отсуствие таймаутов.

Если все это не учесть могут выползать баги мешками.

Это конечно личное ИМХО, но я тут решил серьезно изучить сокеты на php.

Вот запиливаю функцию которая правильно бы записывала в сокет.

Тут функция пока не поддерживает множественные коннекты, может работать только с 1 подключением. И буфер 1. При множественных конектах нужно делать общий буфер наверно в виде массива, но как по нормальному определить размер выделенной памяти под этот массив... сказать сложно.

Работает оно следующим образом. Когда мой некоторый код, записывает данные, на самом деле он буферизируется, вызовов write_socket может быть за 1 итерацию цикла много, и чтобы лишний раз не дергать буферизирую все данные, затем, когда происходит новая итерация цикла вызываю write_socket(null, true) и все данные которые уместились в socket_tcp_sendspace (При условии, что буфер записи свободен) разом отправляются, естественно данные фрагментируются, и при следующей итерации уже остаток доставляется. Так же пока не допилил отлов WSAEWOULDBLOCK, чтобы более корректно было. Так же перед write_socket(null, true) стоит socket_select проверяющий доступность сокета на запись, зачем дергать функцию, если на другом конце стоит воздушный модем с пингом 40к и каналом 16 кб сек.

	private function write_socket($cmd, $buffered = false)
{
// Add control WSAEWOULDBLOCK!

if($buffered === false)
{
if(strlen($this->write_buffer) < $this->options['write_buffer_size'])
{
$this->write_buffer .= $cmd.'|';
return true;
}
else
{
return false; // sock throttling. ignore data.
}
}

else
{
if($this->write_buffer === null)
return false;

$data_length = strlen($this->write_buffer);

if($data_length < $this->socket_tcp_sendspace)
$current_data = &$this->write_buffer;
else
$current_data = substr($this->write_buffer, 0, $this->socket_tcp_sendspace);

$sent_length = socket_write($this->handle_connection, $current_data, $this->socket_tcp_sendspace);

if($data_length === $sent_length)
$this->write_buffer = null;
else
$this->write_buffer = substr($this->write_buffer, $sent_length);

return true;
}
}


$this->socket_tcp_sendspace = socket_get_option($this->handle_connection, SOL_SOCKET, SO_SNDBUF);

Так получаю размер буфера отправки. На винде он примерно 8к с копейками, на юниксах (фрибизди) можно буфер побольше сделать у меня 32к стоит. И вообще шоколад =)
PMПисьмо на e-mail пользователюСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Guest  
Дата
Цитировать сообщение


Гость пожелал остаться неизвестным

Unregistered









ph34r.gif
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса