Проблема с Cocoaasyncsocket, проблема с подключением GCDAsyncSocket

почему при попытке подключения, когда сервер не отвечает, "попробовать" показывает, что он подключен?

Мне нужно проверить статус соединения. Каждый раз, несмотря на настройку таймаута, показывает, что подключено...

Мой код:

        socket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main)
        do {
            try socket?.connect(toHost: "192.168.1.1", onPort: 5000, withTimeout: 5)
            print ("connect")

        }catch  {
            print("socket error")

        }

И еще один вопрос,

я создаю два сокета на одном порту:

socket1.connect(toHost: "192.168.1.1", onPort: 5000, withTimeout: 5)
socket2.connect(toHost: "192.168.1.1", onPort: 5000, withTimeout: 5)

в функции:

func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
 ...
}

Как определить, какой сокет (socket1 или socket2) был отключен?


person prem111    schedule 20.01.2020    source источник


Ответы (2)


GCDAsyncSocket имеет методы делегата (и в приведенном выше примере кода вы устанавливаете делегата на self). Итак, реализуйте крошечную функцию с эквивалентом этой функции в Swift:

- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port

Что-то типа:

socket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main)
do {
    // I don't think socket should be optional here...
    try socket.connect(toHost: "192.168.1.1", onPort: 5000, withTimeout: 5)

} catch  {
    print("socket error")

}

func socket(socket : GCDAsyncSocket, didConnectToHost host:String, port p:UInt16)
{
    print("connected to \(host) & \(port)")
}

куда вы переместили свой "print("connected!")" туда. Если сокет подключен, вы увидите печать в консоли.

person Michael Dautermann    schedule 20.01.2020
comment
Что делать, если он не может подключиться? как проверить? Спасибо за ответ. - person prem111; 20.01.2020
comment
если есть ошибка, вы должны увидеть socket error в консоли. Вот для чего твой catch кейс. - person Michael Dautermann; 20.01.2020
comment
Ну проблема в том, что ошибки нет. Я пишу с подключенным, хотя он не подключен. - person prem111; 20.01.2020
comment
поэтому метод didConnectToHost действительно срабатывает (если вы установите там точку останова, сработает ли он и остановит выполнение Xcode?). Я только что обновил подключенную линию. Какой хост и порт подключены? - person Michael Dautermann; 20.01.2020
comment
Если сервер работает, у меня есть: подключен к 192.168.1.1 и 5000. Если сервер не работает, у меня нет ошибок ... - person prem111; 20.01.2020
comment
Нет. У меня все еще есть проблема. Почему не появляется ошибка, когда он не может подключиться? и как проверить, подключен я в данный момент или отключен.... - person prem111; 20.01.2020

Я бы присвоил значение свойству «tag» для каждого сокета, а затем в делегате сравнил бы параметр socket.tag, чтобы выяснить, какой из них отключен.

socket1.tag = 1
socket2.tag = 2


func socket(socket : GCDAsyncSocket, didConnectToHost host:String, port p:UInt16)
{
    if (socket.tag==1) {
       print("Socket 1 disconnected")
    } 
}
person JoeGalind    schedule 20.01.2020
comment
Значение типа «GCDAsyncSocket?» не имеет тега члена - person prem111; 20.01.2020