Определить разрыв соединения winsock

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
TiG
Постоялец
Постоялец
 
Сообщения: 327
Зарегистрирован: 12.05.2003 (Пн) 12:34
Откуда: Ростов-на-Дону

Определить разрыв соединения winsock

Сообщение TiG » 04.10.2005 (Вт) 11:23

Это опять я(((

1. Сервер открывает соединения. Например 500 соединений, из них 400 не фунциклирует, а просто открыты, т.к. пользователи отвалились от инэта. Вапрос: как эти 400 открытых, но не фунциклюрующих соединений будут влиять на загруженность сервера?
2. Как определить что пользователь отвалился от интернета? (команды что-то не могу найти в нэте)
3. Сколько один winsock может теоритически держать соединений?

ух... я про контрол конечно же, апи пока нет желания юзать...
Все мои игрушки мама разметало ураганом...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 04.10.2005 (Вт) 12:32

Сколько один winsock может теоритически держать соединений?


И теоритически и практически только одно
Как определить что пользователь отвалился от интернета?

Проверить на его компе наличие связи с ИНетом (поиск по форуму)
Как влияет?
Почти никак - ведь сетевой трафик не гоняется...
А я все практикую лечение травами...

TiG
Постоялец
Постоялец
 
Сообщения: 327
Зарегистрирован: 12.05.2003 (Пн) 12:34
Откуда: Ростов-на-Дону

Сообщение TiG » 04.10.2005 (Вт) 12:46

Ну ты кадр)))) по поводу первых ответов сомнительно, а разрыв то надо определить на сервере, а не на клиенте. Можно послать ему чаго-нить, и придет ошибка что его типа нет, но ошибочка вырубает сервер! Может знает кто-нить как эта ошибку оседлать, чтоб она не убивала сервер.


П.С. Наверное я неверно выразился, не соединений, а сессий.
Все мои игрушки мама разметало ураганом...

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

Сообщение tyomitch » 04.10.2005 (Вт) 13:20

Winsock_Close лови
Изображение

TiG
Постоялец
Постоялец
 
Сообщения: 327
Зарегистрирован: 12.05.2003 (Пн) 12:34
Откуда: Ростов-на-Дону

Сообщение TiG » 04.10.2005 (Вт) 13:34

Код: Выделить всё

If tcpServer(Index).State <> 7 Then tcpServer(Index).Close


эта фенька работает если клиент закрыть, а вот если выдернуть кабель из сетефухи, продолжается сессия бесконечно(((

2 tyomitch: Winsock_Close лови
Хде и как его ловить?
Все мои игрушки мама разметало ураганом...

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

Сообщение tyomitch » 04.10.2005 (Вт) 13:40

TiG писал(а):2 tyomitch: Winsock_Close лови
Хде и как его ловить?

А как ты приходящие данные читаешь? :shock:
Неужели тоже в цикле?
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 04.10.2005 (Вт) 13:42

tyomitch писал(а):Winsock_Close лови

А также _Error.
Lasciate ogni speranza, voi ch'entrate.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 04.10.2005 (Вт) 14:01

Не дружище, кадр - ты, если думаешь что один винсок держит больше одного соединения. По второму вопросу аналогично...
А я все практикую лечение травами...

TiG
Постоялец
Постоялец
 
Сообщения: 327
Зарегистрирован: 12.05.2003 (Пн) 12:34
Откуда: Ростов-на-Дону

Сообщение TiG » 04.10.2005 (Вт) 14:04

нде..... в ощем хз я.
помоги плз, вот код, допиши хде ловить.


Dim INTMAX As Integer
Private Sub Form_Load()
INTMAX = 0
tcpServer(0).Listen
Timer1.Enabled = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
For I = 0 To INTMAX
tcpServer(INTMAX).Close
Next I
End Sub

Private Sub tcpServer_ConnectionRequest(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
INTMAX = INTMAX + 1
Load tcpServer(INTMAX)
tcpServer(INTMAX).Accept requestID
End If

End Sub

Private Sub tcpServer_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim strData As String
tcpServer(Index).GetData strData
If Index = 1 Then Text1.Text = strData
If Index = 2 Then Text2.Text = strData
End Sub



Private Sub Timer1_Timer()
For Index = 1 To INTMAX
tcpServer(Index).SendData "opros"
Next Index
End Sub

Private Sub tcpServer_Error(Index As Integer, 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)

тут надо?

End Sub


Когда сеть или клиент закрыт приходит ошибка:
Run-time error '40006'

[/code]
Все мои игрушки мама разметало ураганом...

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 04.10.2005 (Вт) 14:08

Дописать не могу - VB не стоит.

Что "Где ловить?"? Событие Close? Если с сокетом произошло это событие, то значит связь "кончилась". Вот и обрабатывай это сообщение...
А я все практикую лечение травами...

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

Сообщение tyomitch » 04.10.2005 (Вт) 20:10

TiG, допиши:
Код: Выделить всё
Private Sub tcpServer_Close(Index As Integer)
    MsgBox "Ну ёлки-палки! Клиент отпал!"
    tcpServer(Index).Close
End Sub
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 05.10.2005 (Ср) 9:05

tyomitch, кто ж так делает? :)
Надо строки поменять местами.
Lasciate ogni speranza, voi ch'entrate.

TiG
Постоялец
Постоялец
 
Сообщения: 327
Зарегистрирован: 12.05.2003 (Пн) 12:34
Откуда: Ростов-на-Дону

Сообщение TiG » 05.10.2005 (Ср) 16:34

Пасиб)
Один нюанс! если выдернуть кабель из сетевухи и посылать клиенту что-нить, то ошибки не выскакивает и событие закрытия тоже не происходит, почему-то "соединение" остается активным.

Походу разрыв можно определить только создав собственный таймер и прописав в нем, что если после того как клиенту кинули контрольный запрос и через 5 сек не пришел ответ, знач от отвалился, да?
Все мои игрушки мама разметало ураганом...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.10.2005 (Ср) 23:03

И событие error тоже не происходит?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение tyomitch » 05.10.2005 (Ср) 23:26

Тоже. Если выдернуть провод, то TCP-стек не узнает об этом до тех пор, пока что-нибудь не пошлёт и не дождётся ответа.

Это не баг в Винде, это фича TCP :-)
Изображение

TiG
Постоялец
Постоялец
 
Сообщения: 327
Зарегистрирован: 12.05.2003 (Пн) 12:34
Откуда: Ростов-на-Дону

Сообщение TiG » 06.10.2005 (Чт) 8:40

пасиб, теперь точно знаю, что придеться поизвращяться)))
Все мои игрушки мама разметало ураганом...

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

Сообщение tyomitch » 06.10.2005 (Чт) 11:41

TiG, извращаться не надо: достаточно каждые N секунд слать "пинги" клиентам. Тогда о выдернутом проводе ты узнаешь немедленно.
Изображение

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 06.10.2005 (Чт) 20:22

tyomitch писал(а):TiG, извращаться не надо: достаточно каждые N секунд слать "пинги" клиентам. Тогда о выдернутом проводе ты узнаешь немедленно.
Вот это как раз и есть извращаться :)
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

TiG
Постоялец
Постоялец
 
Сообщения: 327
Зарегистрирован: 12.05.2003 (Пн) 12:34
Откуда: Ростов-на-Дону

Сообщение TiG » 07.10.2005 (Пт) 11:37

tyomitch
иногда запрещают пинг, но тоже как вариант)
Все мои игрушки мама разметало ураганом...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 07.10.2005 (Пт) 11:54

Под пингом tyomitch имел ввиду не ICMP-пакеты.
Просто отправлять сокету команду "ау?" и ловить в ответ "я тут".
Lasciate ogni speranza, voi ch'entrate.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 07.10.2005 (Пт) 12:02

alibek писал(а):Под пингом tyomitch имел ввиду не ICMP-пакеты.
Просто отправлять сокету команду "ау?" и ловить в ответ "я тут".
А если в ответ придет "А если туда гранату бросить", то срочно Unload WinSock(Index) :)
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

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

Сообщение tyomitch » 08.10.2005 (Сб) 17:02

alibek писал(а):Под пингом tyomitch имел ввиду не ICMP-пакеты.
Просто отправлять сокету команду "ау?" и ловить в ответ "я тут".

Даже не обязательно ловить "я тут".
Не дождавшись подтверждения о приёме, TCP-стек сам сгенерирует ошибку.
Изображение

TiG
Постоялец
Постоялец
 
Сообщения: 327
Зарегистрирован: 12.05.2003 (Пн) 12:34
Откуда: Ростов-на-Дону

Сообщение TiG » 10.10.2005 (Пн) 11:42

выходные однако кончились))))

Как пинг то слать? Код напиши плз, поэксперементирую устойчивость этого способа.
Все мои игрушки мама разметало ураганом...

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

Сообщение tyomitch » 10.10.2005 (Пн) 11:44

Код: Выделить всё
Winsock.SendData "ау?"
Изображение

TiG
Постоялец
Постоялец
 
Сообщения: 327
Зарегистрирован: 12.05.2003 (Пн) 12:34
Откуда: Ростов-на-Дону

Сообщение TiG » 10.10.2005 (Пн) 15:33

Ндя.... чего-то я не знаю, и сделав кое-что трудоемкое получил нехорошее явление(((
Данные от клиентов, даже если с интервалом большим, поочередно слать, то они перемешиваются((( Не пойму почему. Ведь у каждого сокета свой RequestID. Может нельзя юзать один порт? Или нельзя использовать индексируемые winsock контролы, а делать отдельный для каждого клиента?
Ищу щяс теорию по этому вопросу, подскажите кто знает в чем моя ощибка.
Все мои игрушки мама разметало ураганом...

TiG
Постоялец
Постоялец
 
Сообщения: 327
Зарегистрирован: 12.05.2003 (Пн) 12:34
Откуда: Ростов-на-Дону

Сообщение TiG » 10.10.2005 (Пн) 15:53

Перечитывал щяс чуть ранее созданные темы, и там Алибек чавой-то про Dart говорил. Типа проблемма все-таки в юзанье одного порта и надо попробовать этот контрол заюзать. Теоритически он медленее и глючнее, но другого выбора у меня нет?

Если я угадал, то подскажите плз хде его скачать мона.
Все мои игрушки мама разметало ураганом...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 10.10.2005 (Пн) 16:07

TiG писал(а):Теоритически он медленее и глючнее, но другого выбора у меня нет?

Практически он быстрее и надежнее. Только денег стоит.
Но без базовых знаний никакие волшебные компоненты тебе не помогут.
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение tyomitch » 10.10.2005 (Пн) 17:18

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

Покажи код своего _DataArrival
Изображение

TiG
Постоялец
Постоялец
 
Сообщения: 327
Зарегистрирован: 12.05.2003 (Пн) 12:34
Откуда: Ростов-на-Дону

Сообщение TiG » 11.10.2005 (Вт) 8:36

Воть:

Код: Выделить всё

obmen(ses).GetData priem
Text1.Text = priem
If priem = "0" Then obmen(ses).SendData priem
If priem = "0" Then Check1(ses).Value = 0
If priem = "0" Then Text2(ses).Text = 2
If priem = "0" Then Text3(ses).Text = 3

If priem = "1" Then obmen(ses).SendData priem
If priem = "1" Then Check1(ses).Value = 1
If priem = "1" Then Text2(ses).Text = 2
If priem = "1" Then Text3(ses).Text = 3

If priem = "6" And Text3(ses).Text > 0 Then obmen(ses).SendData priem
If priem = "6" And Text3(ses).Text > 0 Then Text3(ses).Text = Text3(ses).Text - 1
If priem = "7" And Text3(ses).Text > 0 Then obmen(ses).SendData priem
If priem = "7" And Text3(ses).Text > 0 Then Text3(ses).Text = Text3(ses).Text - 1
If priem = "8" And Text3(ses).Text > 0 Then obmen(ses).SendData priem
If priem = "8" And Text3(ses).Text > 0 Then Text3(ses).Text = Text3(ses).Text - 1
If priem = "9" And Text3(ses).Text > 0 Then obmen(ses).SendData priem
If priem = "9" And Text3(ses).Text > 0 Then Text3(ses).Text = Text3(ses).Text - 1
If priem = "10" And Text3(ses).Text > 0 Then obmen(ses).SendData priem
If priem = "10" And Text3(ses).Text > 0 Then Text3(ses).Text = Text3(ses).Text - 1
If priem = "11" And Text3(ses).Text > 0 Then obmen(ses).SendData priem
If priem = "11" And Text3(ses).Text > 0 Then Text3(ses).Text = Text3(ses).Text - 1
If priem = "12" And Text3(ses).Text > 0 Then obmen(ses).SendData priem
If priem = "12" And Text3(ses).Text > 0 Then Text3(ses).Text = Text3(ses).Text - 1
If priem = "13" And Text3(ses).Text > 0 Then obmen(ses).SendData priem
If priem = "13" And Text3(ses).Text > 0 Then Text3(ses).Text = Text3(ses).Text - 1
If priem = "skorost" Then Timer3(ses).Enabled = True
If priem = "manevr" Then Timer4(ses).Enabled = True
If priem = "player" Then Timer7.Enabled = True

If priem <> "0" And priem <> "player" And priem <> "1" And priem <> "2" And priem <> "3" And priem <> "4" And priem <> "5" And priem <> "6" And priem <> "7" And priem <> "8" And priem <> "9" And priem <> "10" And priem <> "11" And priem <> "12" And priem <> "13" And priem <> "14" And priem <> "skorost" And priem <> "manevr" Then Timer1(ses).Enabled = True


P.S. 2 Алибек, а насколько он платный)? Регистрацию требует или не валяется где не поподя в интернете? [/syntax]
Все мои игрушки мама разметало ураганом...

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 11.10.2005 (Вт) 8:49

:shock:

TiG, ты про Select Case слышал?
Lasciate ogni speranza, voi ch'entrate.

След.

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

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

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

    TopList