Что нового

TCP: прослушивание одним, а прием вторым скриптом

avtoIT

Новичок
Сообщения
94
Репутация
0
Пытался реализовать "многопоточность" в TCP, т.е. делая Listen и Accept в одном, а все дальнейшие действия в следующем скрипте.
От первого скрипта передавался во 2й скрипт сокет (полученный TCPAccept), через параметры. Далее 2й скрипт пытался получить отправляемые клиентом пакеты TCPRecv (ставил ограничение в 10 секунд на TCPRecv, при достижении которого клиенту возвращалось сообщение с ошибкой), но проблема в том, что данные просто не доходили ни в одну ни в другую сторону.
Вот примеры скриптов

Сервер 1 (Listen + Accept)
Код:
#pragma compile(AutoItExecuteAllowed, true)
TCPStartup()

$listen = TCPListen ("127.0.0.1", 65432)

Do
	$socket = TCPAccept($listen)
	If @error Then
		MsgBox(0, "TCPAccept", @error)
		Exit
	EndIf
Until $socket <> -1


Run('"' & @AutoItExe & '" /AutoIt3ExecuteScript "' & @ScriptDir & '\testreceiver.exe' & '" ' & _
		$socket, '')


Сервер 2 (Recv)
Код:
#pragma compile(AutoItExecuteAllowed, true)
;TCPStartup() - пытался еще раз запускать TCP службы, но как я понимаю это не нужно и не помогло

If Not $CmdLine[0] Then
    Exit
EndIf
$socket = $CmdLine[1]
$str = ''

Do
	$str = TCPRecv ($socket, 10000)
Until $str <> ''


MsgBox (0, 0, $str)


Клиент
Код:
$ipadress = "127.0.0.1"
$port = 65432
$socket = 0



TCPStartup()
OnAutoItExitRegister("OnAutoItExit")


$socket = TCPConnect ($ipadress, $port)


TCPSend ($socket, 'Тестовое сообщение')

$str = ''
Do

	$str = TCPRecv ($socket, 1000000)
	ToolTip ($str)
	Sleep (1000)
Until $str <> ''


MsgBox (0, 0, $str)

TCPCloseSocket ($socket)

Func OnAutoItExit()
    TCPShutdown()
EndFunc


В чем может быть проблема?
 

Prog

Продвинутый
Сообщения
537
Репутация
65
avtoIT [?]
В чем может быть проблема?
Процессы в отличие от потоков изолированы между собой и сокет одного процесса недействителен в остальных.
Нужно запомнить что многопроцессность и многопоточность это не одно и тоже в плане программирования!
 
Автор
A

avtoIT

Новичок
Сообщения
94
Репутация
0
И как же тогда можно решить эту проблему? :(
Ведь если несколько пользователей будут загружать файлы по 6 мб, а у одного из них будет 3г модем со скоростью 100 кб/сек, все оставшиеся люди будут должны его ждать?
 

Prog

Продвинутый
Сообщения
537
Репутация
65
В случае сервера, получаем идентификатор сокета для каждого клиента. Можно по очереди слать по кусочку файла. Одного потока хватит для одновременной отправки файлов многим клиентам.
 
Автор
A

avtoIT

Новичок
Сообщения
94
Репутация
0
Видимо не совсем ясно объяснил проблему, что серверу будут высылаться данные.
У сервера пропускная способность 10 мб
Есть 10 клиентов, у 2-10 тоже примерно 10 мб в сек, а у 1го 10 кб в сек

1ый соответственно подключился первым и шлет файлик 60 секунд, а остальные его ждут

Все равно придется делать многопоточность... Надо подумать только как...
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Зачем ждать? Одновременно можно обслуживать не одного клиента, а множество. Каждому за раз отсылать по 10 КБ из файла и отправлять по очереди всем клиентам. Тогда пропуская способность почти равномерно распределится между всеми.
Для хранения данных клиента весьма желательно завести массив структур, в котором хранить номера сокетов, имена и идентификаторы файлов, сколько байт отправлено и т. д.
 
Автор
A

avtoIT

Новичок
Сообщения
94
Репутация
0
Не с сервера отправляется файл, а от клиента серверу, каждый файл разный.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Сути это не меняет. Сервер может принимать файлы от множества клиентов.
 
Автор
A

avtoIT

Новичок
Сообщения
94
Репутация
0
Я верно понимаю, что вы предлагаете заводить массив и делать это примерно так
Код:
Бесконечный цикл
      Включаем прослушивание, если есть человек в очереди, аццептим и в очередь (в конец) кидаем его сокет + в массив[сокет] записываем TimerInit()
      Запускаем цикл от 1 до числа эл. в очереди
             TCPRecv, если пусто и проверяем TimeDiff(массив[сокет]) > 5000 отключаем
             Иначе Если пусто то кидаем сокет в конец очереди
             Иначе делаем что-то с данными и отсылаем ответ пользователю
      КЦ
КЦ бесконечного цикла

Верно я вас понимаю?
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Вот так.
Бесконечный цикл
Анализируем события сервера
Если клиент подключился
Добавляем его в массив
Если клиент отключится
Удаляем из массива информацию о нем.
Если клиент прислал данные
Записываем их в файл (в какой именно, смотрим в массиве с информацией о клиенте).
Если событий нет
Пауза на несколько миллисекунд.
КЦ
КЦ бесконечного цикла
 
Верх