J'ai un programme iPod touch qui devrait recevoir des messages d'un programme serveur sur mon mac. Pour m'assurer que le touch peut recevoir des messages d'un ordinateur autre qu'un mac, j'ai programmé le serveur en C++. Si j'exécute à la fois le serveur et l'application iPod sur le même ordinateur (l'application fonctionnant sur le simulateur), la connexion fonctionne et tout va bien. Cependant, lorsque j'essaie de me connecter au serveur depuis mon appareil, la connexion expire. Quelqu'un peut-il repérer le problème ? Je ne suis pas très bon en réseau et en général avec l'iPhone OS.
server.cpp:
sockfd = socket(PF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
cout << "ERROR opening socket";
return;
}
memset((char *)&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(portno);
if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
cout << "ERROR on binding";
return;
}
listen(sockfd,5);
clilen = sizeof(cli_addr);
newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr, (socklen_t*)&clilen);
if (newsockfd < 0) {
cout << "ERROR on accept.";
return;
}
Le serveur reste bloqué à l'accept(), en attente de l'application...
client.m:
CFReadStreamRef readStream = NULL;
CFWriteStreamRef writeStream = NULL;
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef)hostName, portNum, &readStream, &writeStream);
if (readStream && writeStream) {
NSLog(@"Starting streams");
CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
inputStream = (NSInputStream *)readStream;
[inputStream retain];
[inputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
outputStream = (NSOutputStream *)writeStream;
[outputStream retain];
[outputStream setDelegate:self];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream open];
}
if (readStream)
CFRelease(readStream);
if (writeStream)
CFRelease(writeStream);
Aussi loin que je puisse le dire, ni le serveur ni le client ne signalent d'erreurs (je vérifie à travers errno et NSError) autre que le délai d'expiration.
Si quelqu'un peut m'aider avec cela, merci beaucoup !