2013-05-02 6 views
0

Я использую следующий код, чтобы открыть поток, который отправляет файлы на FTP. то, что мне нужно, это получить сокет из этого, чтобы я мог реализовать второй код, размещенный здесь.get socket from Stream

self.networkStream = CFBridgingRelease(
              CFWriteStreamCreateWithFTPURL(NULL, (__bridge CFURLRef) url) 
              ); 
    assert(self.networkStream != nil); 

    if ([usernameText length] != 0) { 
     success = [self.networkStream setProperty:usernameText forKey:(id)kCFStreamPropertyFTPUserName]; 
     assert(success); 
     success = [self.networkStream setProperty:passwordText forKey:(id)kCFStreamPropertyFTPPassword]; 
     assert(success); 
    } 

    self.networkStream.delegate = self; 
    [self.networkStream setProperty:(id)kCFBooleanFalse forKey:(id)kCFStreamPropertyFTPAttemptPersistentConnection]; 
    [self.networkStream setProperty:(id)kCFBooleanTrue forKey:(id)kCFStreamPropertyShouldCloseNativeSocket]; 

    [self.networkStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [self.networkStream open]; 

.

CFSocketRef cfsock = [sock getCFSocket]; 
CFSocketNativeHandle rawsock = CFSocketGetNative(cfsock); 
int flag = 1; 
int result = setsockopt(rawsock, IPPROTO_TCP, TCP_NODELAY, 
        (char *)&flag, sizeof(int)); 
if (result != 0) 
    NSLog(@\"Could Not Disable Nagle...\"); 
else 
    NSLog(@\"Nagle Is Disabled.\"); 

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

благодаря

ответ

2

Вызов CFWriteStreamCopyProperty() на вашем потоке записи и указать kCFStreamPropertySocketNativeHandle получить CFDataRef, содержащий лежащую в основе CFSocketNativeHandle. Затем вы можете извлечь сокет с CFDataGetBytes().

CFSocketNativeHandle rawsock; 
CFDataRef socketData = 
    CFWriteStreamCopyProperty((__bridge CFWriteStreamRef)(self.networkstream), 
          kCFStreamPropertySocketNativeHandle); 
CFDataGetBytes(socketData, 
       CFRangeMake(0, sizeof(CFSocketNativeHandle)), 
       (UInt8 *)&rawsock); 
CFRelease(socketData); 

/* Make use of rawsock */ 
+0

жаль, что я довольно зеленый на этом .. вы могли бы привести пример? спасибо за помощь! – sharkyenergy

+0

спасибо, продолжайте получать "cannt disable nagle" .. любая идея почему? спасибо за вашу помощь, очень ценю это. – sharkyenergy

+0

Проверьте, не работает ли rawsock> 0. Если нет, вы открыли свой сетевой поток перед вызовом CFWriteStreamCopyProperty? Родственный сокет может не выделяться до тех пор. – jatoben