Страница: 1 |
Вопрос не как юзать WinSock а как его сделать независаемым ? т.е. Если клиент конектится к серверу, а потом комп перезагружается то соедениться будет не возможно пока не перезапустить клиент. Вопрос собственно в том как это все обрабатывать и в каких событиях, или может надо не держать конект все время, а конектится тока на время передачи данных ?
Проверяй свойство State. Например: if winsock1.State = sckclosed then winsock1.close winsock1.localport = 88 winsock1.listen end if Если нужен исходник пиши на aonhyper@rambler.ru Вообще-то, я обычно делал немного по-другому. Присваивал объекту Winsock.Index=0 Затем создавал load winsock1(1) ... ... ... unload winsock1(1) Т.е. никаких перезапусков клиента, winsock с каждым коннектом создается заново. С событиями все просто, да и не так их много. По крайней мере, так я писал проксю, и она неплохо работала... Привет LamerOnLine, а куском кода в меня швырнуть можешь ? Чтобы не держать коннект все время используй не TCP а UDP. Использовать нужно на обоих компах. Тогда сервер будет ждать коннекта, и при оном возникает событие, DataArrival кажется. В нем все обрабатывай. Сколько делал клиентсерверных прог, всегда использую UDP. Убил я его давно, код этот. Да и зачем он тебе? Я делал не на 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 2 LamerOnLine и мне плизззз: danger2002@bk.ru Malyav UDP конечно хорошо но и клиент и сервер должны знать IP друг друга Самое стабильное пока устанавливать связь на время передачи данных а потом дисконект, но это достаточно медленно Загружать и выгружать WinSock(и) тоже не спасает Дело в том что если Клиент к примеру снять по ctrl+alt+del(В процесах) то сервер не определяет что клиент потерян и повторное соединение приводит к ошибке, Попробую поменять формулировку вопроса Как выловить то что клиент или сервер больше не работает ??? Если компьютеры в сети, то IP обычно постояныый. Если нет, вместо него использовать имя. Как выловить то что клиент или сервер больше не работает ??? Перед отправкой данных или периодически отправлять на другой комп какую-нибудь специальную строку и ждать ответа. На той стороне, конечно, должно ее принять и дать стандартный ответ. Если ответа нет, то по таймауту выводить сообщение о том, что клиент/сервер не отвечает. Что-то вроде "пингования" другого компа. Насколько я понял, сервер или клиент могут сами неконтролируемо отвалиться. На этот случай я у себя сделал мааааленькую программку, которая запускается периодически из планировщика. Проверяет, есть ли форма моего клиента, и не находя давит все процессы клиента и вновь его запускает. Как я уже говорил, всегда использую UDP. Если устанавливаешь коннект, то обваленный сервер определится по таймауту. Если же обрыв произошел при установленном коннекте, то по событию Winsock_Error const sckConnectAborted или sckConnectionReset. Конечно, обваленный клиент до коннекта ты не определишь - просто не будет ConnectRequest и, соотвестственно, Accept. Вот пример: в 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 |
Вопрос: Клиент-Сервер на WinSock ?????
Добавлено: 15.08.03 09:40
Автор вопроса: Grayich | Web-сайт:
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
Demon
ICQ: 7026585
Вопросов: 18
Ответов: 96
Web-сайт:
Профиль | | #1
Добавлено: 15.08.03 10:34
Номер ответа: 2
Автор ответа:
HyperMen
Вопросов: 12
Ответов: 11
Web-сайт:
Профиль | | #2
Добавлено: 16.08.03 19:24
Номер ответа: 3
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #3
Добавлено: 18.08.03 09:16
Номер ответа: 4
Автор ответа:
Grayich
ICQ: 208280504
Вопросов: 56
Ответов: 164
Web-сайт:
Профиль | | #4
Добавлено: 18.08.03 20:48
Номер ответа: 5
Автор ответа:
Malyav
ICQ: 8440085
Вопросов: 15
Ответов: 117
Web-сайт:
Профиль | | #5
Добавлено: 19.08.03 08:10
Номер ответа: 6
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #6
Добавлено: 19.08.03 08:49
Номер ответа: 7
Автор ответа:
Danger2002
Вопросов: 10
Ответов: 109
Профиль | | #7
Добавлено: 22.08.03 22:20
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 25.08.03 08:53
????????? ...что?
Номер ответа: 9
Автор ответа:
Grayich
ICQ: 208280504
Вопросов: 56
Ответов: 164
Web-сайт:
Профиль | | #9
Добавлено: 25.08.03 16:44
Номер ответа: 10
Автор ответа:
Malyav
ICQ: 8440085
Вопросов: 15
Ответов: 117
Web-сайт:
Профиль | | #10
Добавлено: 26.08.03 07:41
Номер ответа: 11
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #11
Добавлено: 26.08.03 08:45
Номер ответа: 12
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #12
Добавлено: 26.08.03 11:01