2010-05-21 2 views
1

У меня проблема с моей программой сокета. Я создаю клиентскую программу (мой код ниже) У меня проблема при закрытии сокета с помощью метода разъединения.Проблема с закрытой розеткой

CFSocketRef s; 


     -(void)CreaConnessione 
     { 
      CFSocketError errore; 

      struct sockaddr_in sin; 

      CFDataRef address; 
      CFRunLoopSourceRef source; 

      CFSocketContext context = { 0, self, NULL, NULL, NULL }; 

      s = CFSocketCreate(
           NULL, 
           PF_INET, 
           SOCK_STREAM, 
           IPPROTO_TCP, 
           kCFSocketDataCallBack, 
           AcceptDataCallback, 
           &context); 

      memset(&sin, 0, sizeof(sin)); 

      int port = [fieldPorta.text intValue]; 
      NSString *tempIp = fieldIndirizzo.text; 
      const char *ip = [tempIp UTF8String]; 

      sin.sin_family = AF_INET; 
      sin.sin_port = htons(port); 
      sin.sin_addr.s_addr = (long)inet_addr(ip); 

      address = CFDataCreate(NULL, (UInt8 *)&sin, sizeof(sin)); 
      errore = CFSocketConnectToAddress(s, address, 0); 

      if(errore == 0){ 
       buttonInvioMess.enabled = TRUE; 
       fieldMessaggioInvio.enabled = TRUE; 

       labelTemp.text = [NSString stringWithFormat:@"Connesso al Server"]; 

       CFRelease(address); 

       source = CFSocketCreateRunLoopSource(NULL, s, 0); 
       CFRunLoopAddSource(CFRunLoopGetCurrent(), 
            source, 
            kCFRunLoopDefaultMode); 

       CFRelease(source); 
       CFRunLoopRun(); 
      } 

      else{ 
       labelTemp.text = [NSString stringWithFormat:@"Errore di connessione. Verificare Ip e Porta"]; 
       switchConnection.on = FALSE; 
      } 

     } 



     //the socket doesn't disconnect 
-(void)Disconnetti{ 

      CFSocketInvalidate(s); 
      CFRelease(s); 
     } 


     -(IBAction)Connetti 
     { 
      if(switchConnection.on) 
       [self CreaConnessione]; 
      else 
       [self Disconnetti]; 

     } 
+2

В чем проблема? Откуда вы знаете, что сокет не закрывается? –

+0

Когда я отправляю сообщение с сервером после «Disconnetti», клиент принимает это сообщение, и это не правильная ситуация. – zp26

+0

есть два типа закрытия сокетов: один близко, другой - после записи. попробуйте другой способ сделать это. – Tattat

ответ

0

Если вы пытаетесь повторно использовать сокет, который вы признали недействительным. Я думаю, вы не можете снова использовать тот же объект сокета.

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

Смежные вопросы