PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как NetworkClient может узнать о разрыве соединения сервером?


Как NetworkClient может узнать о разрыве соединения сервером?

Сообщений 1 страница 6 из 6

1

Как NetworkClient может узнать о разрыве соединения сервером?

NetworkClientEvent() не знает соответствующего события В отличии от NetworkServerEvent()

Код:
Syntax

Result = NetworkClientEvent(Connection) 
Description

Result equals 0 if no data has been received on the specified client port, otherwise there is some data which should be processed. 

The returned value indicates what has actually happened: 
  0                    : Nothing has happened
  #PB_NetworkEvent_Data: Raw data has been received (to be read with ReceiveNetworkData())
  #PB_NetworkEvent_File: A file has been received (to be read with ReceiveNetworkFile())

0

2

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

Код:
Temp=0
DisableDebugger
SendNetworkData(Connect, @Temp, 0)
ErrCode = WSAGetLastError_()
EnableDebugger
If ErrCode
  *Mem = AllocateMemory(1024)
  If *Mem
    FillMemory(*Mem, 1024, 0)
    Len=FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM, 0, ErrCode, 0, *Mem, 1024, 0)
    If Len>0
      Debug PeekS(*Mem, Len)
    EndIf
    FreeMemory(*Mem)
  EndIf
EndIf

Если сервер разорвет соединение, то WSAGetLastError_() вернет код ошибки - 10054.

0

3

Как всегда - стройные теории рушатся при столкновении с правдой жизни  :(
Была такая идея.
Сетевой клиент модуля монитора соединяется с сервером.
Сервер обнаружив подключение начинает слать клиенту данные, которые асинхронно появляются у сервера, и информацию о состоянии.
Клиент висит на соединении и только обрабатывает события прихода данных.

Теперь придется как то проверять состояние соединения.
Или клиент раз в несколько сек отправляет тестовое сообщение серверу с проверкой ошибки.
Или сервер раз в несколько сек отправляет тестовое сообщение клиенту а клиент ловит отсутствие таких сообщений в течении некоторого промежутка времени.

Сейчас попробую первый вариант.

0

4

Лучше сделать так:

Код:
Repeat
  ClientEvent = NetworkClientEvent(Connect)
  If ClientEvent=#PB_NetworkEvent_Data
    
  Else
    
    If ClientEvent=0
      Temp=0
      DisableDebugger
      SendNetworkData(Connect, @Temp, 0)
      ErrCode = WSAGetLastError_()
      EnableDebugger
      If ErrCode = 10054
        CloseNetworkConnection(Connect)
        Break
      EndIf
    EndIf
    
    Delay(10)
  EndIf
  
ForEver

Как только пропадет соединение с сервером, клиент закроет свое соединение и прервет цикл.

0

5

А кроме WSAGetLastError_() можно ли как то сделать проверку? Дело в том, что WSAGetLastError_() - виндовая заморочка. А мне надо под линукс (убунту 12.04 х64). Как обойтись без неё? Спасибо.

0

6

Проверка доступности сервера в линукс.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Как NetworkClient может узнать о разрыве соединения сервером?