Utilisation NSStream - Transfert de fichiers
MonsterFunk
Membre
Bonjour,
Je travail actuellement sur la conception d'une application de transfert de fichiers via le réseau local, via la wifi.
Suite à mes recherches sur internet, j'essai de transferer mes fichiers grace a NSStream.
Lors de l'écriture de data sur l'outputstream j'obtiens le message d'erreur suivant :
"The operation couldn't be completed. Bad file descriptor".
Voici mon code :
Savez vous d'ou peu venir cette erreur ?
Pensez vous qu'il serait plus adapter de passer par la programmation de socket BSD, en langage C ?
Je vous remercie.
Je travail actuellement sur la conception d'une application de transfert de fichiers via le réseau local, via la wifi.
Suite à mes recherches sur internet, j'essai de transferer mes fichiers grace a NSStream.
Lors de l'écriture de data sur l'outputstream j'obtiens le message d'erreur suivant :
"The operation couldn't be completed. Bad file descriptor".
Voici mon code :
- (void)initStream {<br />
NSString *urlStr = [[NSString alloc] initWithFormat:@"127.0.0.1"];<br />
NSURL *iploc;<br />
<br />
if (![urlStr isEqualToString:@""]) {<br />
iploc = [NSURL URLWithString:urlStr];<br />
if (!iploc) {<br />
NSLog(@"Not a valid URL");<br />
return;<br />
}<br />
}<br />
CFReadStreamRef readStream;<br />
CFWriteStreamRef writeStream;<br />
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)[iploc host], 1024, &readStream, &writeStream);<br />
<br />
iStream = (__bridge NSInputStream *)readStream;<br />
[iStream setDelegate:self];<br />
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];<br />
[iStream open];<br />
<br />
oStream = (__bridge NSOutputStream *)writeStream;<br />
[oStream setDelegate:self];<br />
[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];<br />
[oStream open];<br />
}<br />
- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)eventCode {<br />
switch (eventCode) {<br />
case NSStreamEventHasBytesAvailable:<br />
if (theStream == iStream) {<br />
//read data<br />
}<br />
break;<br />
case NSStreamEventHasSpaceAvailable:<br />
if (theStream == oStream) {<br />
//send data<br />
NSString *string = [[NSString alloc] initWithFormat:@"TEST SEND TXT."];<br />
<br />
const uint8_t *rawstring = (const uint8_t *)[string UTF8String];<br />
int len = [oStream write:rawstring maxLength:strlen((char *)rawstring)];<br />
NSLog(@"len : %d", len);<br />
}<br />
break;<br />
case NSStreamEventErrorOccurred:<br />
NSLog(@"- NSStreamEventErrorOccurred");<br />
NSLog(@"Error : %@", [[oStream streamError] description]);<br />
break;<br />
default:<br />
break;<br />
}<br />
}<br />
Savez vous d'ou peu venir cette erreur ?
Pensez vous qu'il serait plus adapter de passer par la programmation de socket BSD, en langage C ?
Je vous remercie.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Quand est-ce que tu reçois ce message ? (premier message au délégué, après d'autres opérations, etc.)
Es-tu sûr que ton ordi peut accepter une connexion sur ce port ?
Au passage, pour vérifier que ton urlStr n'est pas vide je te conseille d'utiliser [urlStr length] != 0, ça marche même quand urlStr est nil. De plus, tu ne gères pas correctement la mémoire pour tes deux streams, tu es responsable de ces deux objets donc tu devrais utiliser __bridge_transfer pour transférer la responsabilité à ARC.