views:

173

answers:

1

Hi, I have an ipod touch program that should receive messages from a server program on my mac. To make sure that the touch can receive messages from a computer other than a mac, I programmed the server in C++. If I run both the server and the ipod app on the same computer (the app running on the simulator), the connection is fine and everything is dandy. However, when I try to connect to the server from my device, the connection times out. Can anyone spot the problem? I'm not too good with networking, and the iPhone OS in general.

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;
}

The server gets stuck at the accept(), waiting for the app...

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);

As far as I can tell, neither server nor client reports any errors (I'm checking through errno and NSError) other than timing out.

If anyone can help me with this, much thanks!

A: 

The iPod was connected to a different network than my Mac, and that's why it got blocked. When I connected to the same network, it works perfectly fine.

confusedKid