Выбор сокета

TiOS поддерживает до 16 сокетов, но на некоторых платформах их может быть меньше. Число сокетов, доступных на вашей платформе, можно узнать с помощью свойства sock.numofsock (только чтение).

Поскольку сокетов может быть несколько, при изменении свойств или вызове методов нужно указывать, к какому сокету вы обращаетесь. Это делается с помощью свойства sock.num. Например:

sock.protocol = 1

Можете ли вы сказать, к какому сокету относится приведённая выше инструкция? Платформа тоже не может. Поэтому правильный синтаксис такой:

sock.num = 0
sock.protocol = 1

Теперь платформа знает, с каким сокетом вы работаете. После того как селектор сокета установлен (с помощью sock.num), все последующие методы и свойства, относящиеся к конкретному сокету, считаются относящимися именно к нему. Таким образом:

sock.num = 0
sock.protocol = 1
sock.connectiontimeout = 10
sock.httpmode = 1 ' etc

События этого объекта не разделены по сокетам. Такое событие, как on_sock_data_arrival, обслуживает все сокеты вашей платформы. Поэтому при входе в обработчик события объекта sock селектор сокета автоматически переключается на номер сокета, на котором произошло событие:

sub on_sock_data_arrival
	dim s as string
	s = sock.getdata(255) ' Note that you did not have to specify any sock.num preceding this statement.
end sub

Из-за этого автоматического переключения по завершении обработчика события сокета свойство sock.num сохраняет новое значение (обратно его ничто не меняет). Это нужно учитывать при обработке других событий, которые используют сокет (но сами не являются событиями сокета). Иными словами, при входе в такой обработчик следует явно задавать свойство sock.num, потому что до этого события оно могло быть изменено автоматически. Для наглядности:

sub on_sys_init ' This is always the first event executed.
	sock.num = 0  ' Supposedly, this would make all subsequent properties and methods refer to this socket.
end sub
sub on_sock_data_arrival ' Then, supposing this event executes.
	dim s as string
	s = sock.getdata(255) ' However, this event happens on the second socket. So now sock.num = 1.
end sub
sub on_ser_data_arrival ' And then this serial port event executes.
	sock.txclear ' You meant to do this for sock.num = 0 (as specified at on_sys_init). But now sock.num was changed to 1! Oops...
end sub

Итак, текущее значение sock.num может измениться только по одной из двух причин: (1) его изменили вручную или (2) произошло событие сокета. Нельзя считать, что значение осталось прежним, если вы задали его в другом месте (ведь за это время могло произойти событие сокета).

Исходный материал Tibbo обновлён 12 сентября 2022Оригинал на docs.tibbo.com · Сообщить об ошибке