Соединение Winsock работает очень странно

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

Соединение Winsock работает очень странно

Сообщение XairOn » 02.10.2004 (Сб) 10:21

Здравствуйте. Никак не могу разобраться, как в winsock устанавливается соединение, а именно: мне нужно достучаться до
сервера, и пока соединение не установлено, пользователь должен видеть соответствующее сообщение, типа "Подождите идёт
соединение", Я делаю цикл по условию:

Do ' делаем цикл
winsock1.Close ' закрываем
winsock1.RemoteHost = 127.0.0.1 'задаем адрес
winsock1.RemotePort = 1001 ' задаем порт на который нужно подлючиться
winsock1.Connect 'подключаемся
DoEvents
Loop While winsock1.State <> 7 ' делаем все это, пока состояние соединения не будер равно 7, т.е подключились

так вот так у меня всё работает, но клиент подключится к серверу только в том случае, когда сервер запущен позже клиента, т.е. что бы подключиться сначала нужно клиента запустить, потом сделать попытку соединения (что бы приведенный мною цикл начал работать), а уж только потом запускать сам сервер :-( Если сервер запущен раньше и уже прослушивает порт, ничего не выходит, клиент никак не хочет соединяться. Вопрос, я думаю, уже понятен, как сделать так, что бы клиент в любом случае подключался, независимо от того когда запущен сервер, а то согласитесь это не очень то удобно, сначала пытаться соедениться а потом запускать сервер к которому мы и пытаемся подключиться???

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.10.2004 (Сб) 10:32

А надо бы так:
Код: Выделить всё
winsock1.Close ' закрываем
winsock1.RemoteHost = 127.0.0.1 'задаем адрес
winsock1.RemotePort = 1001 ' задаем порт на который нужно подлючиться
winsock1.Connect 'подключаемся
Do ' делаем цикл
DoEvents
Loop While winsock1.State <> 7 ' делаем все это, пока состояние соединения не будер равно 7, т.е подключились
Изображение

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 02.10.2004 (Сб) 14:43

Как говорят люди, познавшие дзен, надо сначала While и инструкцию (вдруг коннект на первом шаге?) :lol:
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 02.10.2004 (Сб) 15:16

tyomitch писал(а):А надо бы так:
Код: Выделить всё
winsock1.Close ' закрываем
winsock1.RemoteHost = 127.0.0.1 'задаем адрес
winsock1.RemotePort = 1001 ' задаем порт на который нужно подлючиться
winsock1.Connect 'подключаемся
Do ' делаем цикл
DoEvents
Loop While winsock1.State <> 7 ' делаем все это, пока состояние соединения не будер равно 7, т.е подключились


Так, я разумеется пробовал, но это не ответ на мой вопрос, соединение хоть и происходит, но опять же, если сервер запущен и
слушает порт, до попытки подключиться к нему, но ведь может быть и так, что пользователь сначала начнет подключаться, а сервер будет запущен потом, т.е. попытки соединения (winsock1.close,...,winsock1.connect) должны делаться в цикле, иначе
получается, что есть всего одна попытка или я чего-то не понимаю, если честно я плохо знаю как вообще происходит связь в данном случае, например строка: winsockServer.listen - тут всё ясно, порт будет прослушиваться до тех пор, пока его не закроют или не произойдет соединение, а вот строка: winsockClient.connect мне вообще не понятна, клиент сделает одну попытку соединения или будет делать до тех пор пока его не закроют или не произойдет соединение???

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 02.10.2004 (Сб) 16:43

XairOn писал(а):Так, я разумеется пробовал, но это не ответ на мой вопрос, соединение хоть и происходит, но опять же, если сервер запущен и
слушает порт, до попытки подключиться к нему, но ведь может быть и так, что пользователь сначала начнет подключаться, а сервер будет запущен потом, т.е. попытки соединения (winsock1.close,...,winsock1.connect) должны делаться в цикле, иначе
получается, что есть всего одна попытка или я чего-то не понимаю, если честно я плохо знаю как вообще происходит связь в данном случае, например строка: winsockServer.listen - тут всё ясно, порт будет прослушиваться до тех пор, пока его не закроют или не произойдет соединение, а вот строка: winsockClient.connect мне вообще не понятна, клиент сделает одну попытку соединения или будет делать до тех пор пока его не закроют или не произойдет соединение???

Лол - 10 строк и ни одной точки! :lol:

Клиент сделает одну попытку соединиения, после чего, если сервер не слушал, произойдёт Winsock1_Error с текстом "Connection is forcefully rejected." Вот в его обработчике и стоит повторять попытку подключения:
Код: Выделить всё
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
If Number = sckConnectionRefused Then
    winsock1.Close ' закрываем
    winsock1.RemoteHost = 127.0.0.1 'задаем адрес
    winsock1.RemotePort = 1001 ' задаем порт на который нужно подлючиться
    winsock1.Connect 'подключаемся
End If
End Sub
Изображение

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 02.10.2004 (Сб) 21:15

Спасибо большое, всё работает!


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

    TopList