Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Клиент-Сервер на WinSock ????? Добавлено: 15.08.03 09:40  

Автор вопроса:  Grayich | Web-сайт: grayich.narod.ru | ICQ: 208280504 

Вопрос не как юзать WinSock

а как его сделать независаемым ?

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

 

Ответить

  Ответы Всего ответов: 12  

Номер ответа: 1
Автор ответа:
 Demon



ICQ: 7026585 

Вопросов: 18
Ответов: 96
 Web-сайт: update.sugardas.lt
 Профиль | | #1
Добавлено: 15.08.03 10:34

Проверяй свойство State. Например:

if winsock1.State = sckclosed then

winsock1.close

winsock1.localport = 88

winsock1.listen

end if

Ответить

Номер ответа: 2
Автор ответа:
 HyperMen



Вопросов: 12
Ответов: 11
 Web-сайт: www.phpworld.net.ru
 Профиль | | #2
Добавлено: 16.08.03 19:24

Если нужен исходник пиши на aonhyper@rambler.ru

Ответить

Номер ответа: 3
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #3 Добавлено: 18.08.03 09:16

Вообще-то, я обычно делал немного по-другому.

Присваивал объекту Winsock.Index=0

Затем создавал

load winsock1(1)

...

...

...

unload winsock1(1)

Т.е. никаких перезапусков клиента, winsock с каждым коннектом создается заново.

С событиями все просто, да и не так их много. По крайней мере, так я писал проксю, и она неплохо работала...

Ответить

Номер ответа: 4
Автор ответа:
 Grayich



ICQ: 208280504 

Вопросов: 56
Ответов: 164
 Web-сайт: grayich.narod.ru
 Профиль | | #4
Добавлено: 18.08.03 20:48

Привет LamerOnLine, а куском кода в меня швырнуть можешь ?

 

Ответить

Номер ответа: 5
Автор ответа:
 Malyav



ICQ: 8440085 

Вопросов: 15
Ответов: 117
 Web-сайт: malyav.narod.ru
 Профиль | | #5
Добавлено: 19.08.03 08:10

Чтобы не держать коннект все время используй не TCP а UDP. Использовать нужно на обоих компах. Тогда сервер будет ждать коннекта, и при оном возникает событие, DataArrival кажется. В нем все обрабатывай. Сколько делал клиентсерверных прог, всегда использую UDP.

Ответить

Номер ответа: 6
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #6 Добавлено: 19.08.03 08:49

Убил я его давно, код этот. Да и зачем он тебе? Я делал не на Winsock, а на dsSocket, хотя они очень похожи. Ну а принцип тут вполне понятен.

Есть сырой код (из ранних наработок). Работает не очень стабильно, но так, для образца сойдет

Public ReceiveData As String

Private Sub Client_Accept(Index As Integer, SocketID As Integer)

On Error Resume Next

Load Client(1)

Client(1).Socket = SocketID

Client(0).Close

End Sub

Private Sub Client_Close(Index As Integer, ErrorCode As Integer, ErrorDesc As String)

On Error Resume Next

If Index = 1 Then

Unload Client(1)

Client(0).Listen

End If

End Sub

Private Sub Client_Exception(Index As Integer, ErrorCode As Integer, ErrorDesc As String)

Client(1).Close

End Sub

Private Sub Client_Receive(Index As Integer, ReceiveData As String)

On Error Resume Next

Proxy.Send = ReceiveData

End Sub

Private Sub Form_Load()

On Error Resume Next

App.TaskVisible = False

Proxy.Connect

Client(0).Listen

End Sub

Private Sub Form_Unload(Cancel As Integer)

On Error Resume Next

Client(1).Connect

Client(0).Close

Proxy.Close

Unload Client(1)

Unload Client(0)

Unload Proxy

Set Form1 = Nothing

End Sub

Private Sub Proxy_Close(ErrorCode As Integer, ErrorDesc As String)

On Error Resume Next

Proxy.Connect

End Sub

Private Sub Proxy_Exception(ErrorCode As Integer, ErrorDesc As String)

Proxy.Close

End Sub

Private Sub Proxy_Receive(ReceiveData As String)

On Error Resume Next

If Client(1).State = dsSockStateConnected Then

Client(1).Send = ReceiveData

Else: Client(1).Close

End If

End Sub

Ответить

Номер ответа: 7
Автор ответа:
 Danger2002



Вопросов: 10
Ответов: 109
 Профиль | | #7 Добавлено: 22.08.03 22:20

2 LamerOnLine и мне плизззз: danger2002@bk.ru

Ответить

Номер ответа: 8
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #8 Добавлено: 25.08.03 08:53
????????? ...что?

Ответить

Номер ответа: 9
Автор ответа:
 Grayich



ICQ: 208280504 

Вопросов: 56
Ответов: 164
 Web-сайт: grayich.narod.ru
 Профиль | | #9
Добавлено: 25.08.03 16:44

Malyav  UDP  конечно хорошо но и клиент и сервер должны знать IP друг друга :(

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

Загружать и выгружать WinSock(и) тоже не спасает :(

Дело в том что если Клиент к примеру снять по ctrl+alt+del(В процесах) то сервер не определяет что клиент потерян :( и повторное соединение приводит к ошибке, 

Попробую поменять формулировку вопроса

Как выловить то что клиент или сервер больше не работает ???

 

Ответить

Номер ответа: 10
Автор ответа:
 Malyav



ICQ: 8440085 

Вопросов: 15
Ответов: 117
 Web-сайт: malyav.narod.ru
 Профиль | | #10
Добавлено: 26.08.03 07:41

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

Как выловить то что клиент или сервер больше не работает ???

Перед отправкой данных или периодически отправлять на другой комп какую-нибудь специальную строку и ждать ответа. На той стороне, конечно, должно ее принять и дать стандартный ответ. Если ответа нет, то по таймауту выводить сообщение о том, что клиент/сервер не отвечает. Что-то вроде "пингования" другого компа.

Насколько я понял, сервер или клиент могут сами неконтролируемо отвалиться. На этот случай я у себя сделал мааааленькую программку, которая запускается периодически из планировщика. Проверяет, есть ли форма моего клиента, и не находя давит все процессы клиента и вновь его запускает.

Как я уже говорил, всегда использую UDP.

Ответить

Номер ответа: 11
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #11 Добавлено: 26.08.03 08:45

Если устанавливаешь коннект, то обваленный сервер определится по таймауту.

Если же обрыв произошел при установленном коннекте, то по событию Winsock_Error

const sckConnectAborted или sckConnectionReset.

Конечно, обваленный клиент до коннекта ты не определишь - просто не будет ConnectRequest и, соотвестственно, Accept.

Ответить

Номер ответа: 12
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #12
Добавлено: 26.08.03 11:01

Вот пример:

в general: Public ind as long

в connectionRequst:

Private Sub ws_ConnectionRequest(index As Integer, ByVal requestID As Long)

ind = ind + 1

Load ws(ind)

ws(ind).LocalPort = 1000

ws(ind).Accept requestID

If ind > 1 Then Last = ind - 1

If ind > 1 Then Unload ws(Last)

End Sub

Но тогда изменяется процедура приема данных:

Private Sub ws_DataArrival(index As Integer, ByVal bytesTotal As Long)

Dim Data As String

ws(ind).GetData Data

end sub

И теперь все обращения к винсоку будут выглядеть так:

ws(ind).SendData

и т. п.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам