0

我有一个 ipod touch 程序,它应该从我的 mac 上的服务器程序接收消息。为了确保触摸可以接收来自 Mac 以外的计算机的消息,我用 C++ 对服务器进行了编程。如果我在同一台计算机上同时运行服务器和 ipod 应用程序(模拟器上运行的应用程序),则连接很好,一切都很好。但是,当我尝试从我的设备连接到服务器时,连接超时。谁能发现问题?我对网络和一般的 iPhone 操作系统不太擅长。

服务器.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;
}

服务器卡在accept(),等待应用程序...

客户.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);

据我所知,除了超时之外,服务器和客户端都没有报告任何错误(我正在检查 errno 和 NSError)。

如果有人可以帮助我解决这个问题,非常感谢!

4

1 回答 1

0

iPod 连接到与我的 Mac 不同的网络,这就是它被阻止的原因。当我连接到同一个网络时,它工作得很好。

于 2010-06-04T16:10:42.740 回答