"Одноразовый" порт и Winsock

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

"Одноразовый" порт и Winsock

Сообщение VBTerminator » 05.05.2009 (Вт) 13:12

У меня есть клиентская и серверная части. Обе используют MS Winsock. Но после отправки данных и закрытия приложений, при следующем открытии клиент и сервер не видят друг друга! Меняю номер порта - та же история. В чём может быть дело?

Вот исходники:

Сервер:
Код: Выделить всё
Private Sub Form_Load()
        wsServer.LocalPort = 1031
        wsServer.Listen
End Sub

Private Sub wsServer_ConnectionRequest(ByVal requestID As Long)
        If wsServer.State <> sckClosed Then wsServer.Close
        wsServer.Accept requestID


wsServer.SendData "@hEaDeR:0258"
End Sub


Клиент:
Код: Выделить всё
Private Sub Form_Load()
        wskClient.RemoteHost = "localhost"
        wskClient.RemotePort = "1031"
        wskClient.Connect
End Sub

Private Sub wskClient_DataArrival(ByVal bytesTotal As Long)
        Dim A As String

        wskClient.GetData A

        MsgBox A
End Sub

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: "Одноразовый" порт и Winsock

Сообщение awl100Alex » 05.05.2009 (Вт) 14:11

Ты сам останавливаешь работу Сервера...
Код: Выделить всё
If wsServer.State <> sckClosed Then wsServer.Close

Поэтому нужно заново включить прослушивание сети...
Сервер:
Код: Выделить всё
Private Sub Form_Load()
        wsServer.LocalPort = 1031
        wsServer.Listen
End Sub

Private Sub Timer1_Timer() '250 мсек
If wsServer.State = sckClosing Then
wsServer.Close
Form_Load
End If
End Sub

Private Sub wsServer_ConnectionRequest(ByVal requestID As Long)
        If wsServer.State <> sckClosed Then wsServer.Close
        wsServer.Accept requestID


wsServer.SendData "@hEaDeR:0258"
End Sub

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: "Одноразовый" порт и Winsock

Сообщение Xcode » 05.05.2009 (Вт) 14:35

awl100Alex писал(а):Ты сам останавливаешь работу Сервера...

Извините, что за бред? А как иначе? Это делать необходимо.

awl100Alex писал(а):Поэтому нужно заново включить прослушивание сети...

Оно включается вот здесь:
VBTerminator писал(а):Сервер:
Код: Выделить всё
Private Sub Form_Load()       
wsServer.LocalPort = 1031       
wsServer.ListenEnd Sub


И никаких таймеров здесь не надо. При запуске приложения сокет инициализируется, его состояние по умолчанию sckClosed, ничего вручную закрывать не надо.

VBTerminator, проверь лучше, не висят ли в списке процессов те, "закрытые", тобой приложения. И обрати внимание на очередность запуска(ну мало ли :) ).

Код я проверил, все работает нормально.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: "Одноразовый" порт и Winsock

Сообщение awl100Alex » 05.05.2009 (Вт) 15:10

Xcode писал(а):Код я проверил, все работает нормально.

Плохо проверял, если проверял вообще.

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: "Одноразовый" порт и Winsock

Сообщение Xcode » 05.05.2009 (Вт) 15:17

awl100Alex писал(а):
Xcode писал(а):Код я проверил, все работает нормально.

Плохо проверял, если проверял вообще.

Я даже засомневался :D Проверил еще раз, все символ-в-символ. Работает. Описаной проблемы не возникает.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: "Одноразовый" порт и Winsock

Сообщение VBTerminator » 05.05.2009 (Вт) 18:51

awl100Alex писал(а):Поэтому нужно заново включить прослушивание сети...

ДА! Заработало! Большое спасибо! Теперь работает даже обратная отсылка данных!

Xcode писал(а):Извините, что за бред? А как иначе? Это делать необходимо.

Так он всё равно таймером позже запускается.

Xcode писал(а):И никаких таймеров здесь не надо. При запуске приложения сокет инициализируется, его состояние по умолчанию sckClosed, ничего вручную закрывать не надо.

Пробовал. Получил в лицо "Invalid operation in current state" на wsServer.Accept requestID.

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: "Одноразовый" порт и Winsock

Сообщение Xcode » 05.05.2009 (Вт) 20:05

VBTerminator писал(а):Теперь работает даже обратная отсылка данных!

А раньше что? не работала? :shock:

VBTerminator писал(а):Так он всё равно таймером позже запускается.

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

VBTerminator писал(а):
Xcode писал(а):И никаких таймеров здесь не надо. При запуске приложения сокет инициализируется, его состояние по умолчанию sckClosed, ничего вручную закрывать не надо.

Пробовал. Получил в лицо "Invalid operation in current state" на wsServer.Accept requestID.

Толи вы чего-то не понимаете, толи я. "Invalid operation in current state" у вас может произойти, если сокет не в состоянии sckClosed. Закрывайте сокет перед wsServer.Accept requestID и все будет нормально, что вы, в принципе, и делали...
И вообще причем здесь wsServer.Accept? Я говорил про закрытие сокета и последующий перевод в состояние sckListening по таймеру.

UPD: Я, кажется, начинаю понимать в чем причина наших непоняток. Перечитайте, пожалуйста, внимательно первый пост.
Но после отправки данных и закрытия приложений, при следующем открытии

А имелось ввиду, видимо, закрытие только клиентского приложения.

VBTerminator
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 415
Зарегистрирован: 19.11.2008 (Ср) 20:10

Re: "Одноразовый" порт и Winsock

Сообщение VBTerminator » 06.05.2009 (Ср) 6:10

Xcode писал(а):
VBTerminator писал(а):Теперь работает даже обратная отсылка данных!

А раньше что? не работала? :shock:

Ну да...

Xcode писал(а):Всмысле запускается? И каким еще таймером? В привиденном тобой коде никаких таймеров не было.

Во-первых, речь шла про модификации моего кода.
Во-вторых, ты писал, что "Оно включается вот здесь <...> И никаких таймеров здесь не надо". А таймер-то нужен, потому что
VBTerminator писал(а):Получил в лицо "Invalid operation in current state" на wsServer.Accept requestID.

по той простой причине, что с сокетом было что-то не то, и его требовалось закрыть.

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: "Одноразовый" порт и Winsock

Сообщение Xcode » 06.05.2009 (Ср) 8:47

Дубль два:
При описанной тобой ситуации(закрытие клиента и сервера и вновь их запуск) и привиденном тобой коде, никаких проблем возникать не должно.
VBTerminator писал(а):по той простой причине, что с сокетом было что-то не то, и его требовалось закрыть.

С сокетом все то, при запуске приложения сокет инициализируется и его состояние - закрыт.
Надо правильно излагать проблему.
Ты ведь имел ввиду что перезапущен будет только клиент, а сервер остается рабочим, ведь так?

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: "Одноразовый" порт и Winsock

Сообщение awl100Alex » 06.05.2009 (Ср) 10:26

Xcode писал(а):Ты ведь имел ввиду что перезапущен будет только клиент, а сервер остается рабочим...

Вот именно это и имелось ввиду. :)

Алгоритм работы такой:
Сначала запускается Сервер и устанавливает прослушивание определенного порта сети (ждет своего клиента). Когда Клиент подключается, происходит событие ConnectionRequest, прослушивание должно быть остановлено wsServer.Close перед получением requestID, и я не сказал, что этого быть не должно или это не правильно. Я просто констатировал, что Сервер, после подключения Клиента перестает слушать сеть и начинает работать с установленным соединением через его идентификатор requestID. Когда происходит выгрузка Клиента, сокет переходит в состояние sckClosing, сеть при этом больше НЕ прослушивается Сервером, поэтому все последующие запуски Клиента игнорируются, потому возникает необходимость отследить состояние sckClosing и заново инициировать Сервер на прослушивание сети. Вот и всё. :)

Xcode
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 131
Зарегистрирован: 31.10.2008 (Пт) 8:12
Откуда: Pavlodar

Re: "Одноразовый" порт и Winsock

Сообщение Xcode » 06.05.2009 (Ср) 11:27

awl100Alex писал(а):Вот именно это и имелось ввиду.

Извините, я наверное как-то не правильно выражаю свои мысли, я хотел сказать что автор имел ввиду одну, а в проблеме(1-й пост) описал другую ситуацию.

Процитирую:
VBTerminator писал(а):Но после отправки данных и закрытия приложениЙ, при следующем открытии клиент и сервер не видят друг друга!

Из этого представляется следующий алгоритм дейсвий:
1. Запускаем сервер.
2. Запускаем клиент.
3. Клиент коннектится к серверу.
4. Сервер принимает запрос на подключение, подключает клиента, и отсылает ему сообщение.
5. Закрываются ОБА приложения, клиент и сервер. Для моей уверенности в том, что вы все-таки поняли почему я сделал такой вывод, повторю цитату:
VBTerminator писал(а):Но после отправки данных и закрытия приложений

6. Повторный запуск сервера и клиента.
VBTerminator писал(а):при следующем открытии клиент и сервер не видят друг друга

7. Появляется проблема соединения.

И давайте уже закроем тему. :D

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: "Одноразовый" порт и Winsock

Сообщение awl100Alex » 06.05.2009 (Ср) 11:41

Согласен. :)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 54

    TopList  
cron