在iPhone上使用套接字API

时间:2010-03-12 08:55:00

标签: iphone objective-c sockets

对于一个小项目,我必须在我的iPhone上执行以下任务:

  • 打开TCP套接字
  • 向服务器发送命令
  • 关闭连接的WRITE部分
  • 阅读服务器的回复
  • 关闭连接

我对套接字编程没有经验 - 我刚开始使用网络编程,而且我已经使用了CFStream接口。但显然溪流不足以完成这项任务。

谁能指出我正确的方向?我试图在苹果网站上找到关于套接字的教程,但没有任何内容。

2 个答案:

答案 0 :(得分:2)

看一下CoreFoundation的CFSocket。您可以轻松地将它集成到应用程序的运行循环中,因此不会乱用线程。这个免费的book excerpt向您展示了如何使用它。

CFSocket是bsd套接字的包装器,如果需要设置特殊套接字选项(例如多播),则允许您访问原始套接字句柄。

如果您愿意使用第三方库,CocoaAsyncSocket似乎是一个不错的解决方案(我自己从未尝试过)。

答案 1 :(得分:1)

我不是iPhone的开发人员,但我很好奇你的问题,所以我浏览了一下。

我找到了这个页面:Sockets on iPhone

以下是代码:

- (void)sendcmd:(NSString*)cmd {

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *hostname= [defaults stringForKey:@"hostname"];

    NSHost *host=[NSHost hostWithName:hostname];

    if (host) {

        struct sockaddr_in addr;
        int sockfd;

        // Create a socket
        sockfd = socket( AF_INET, SOCK_STREAM, 0 );

        addr.sin_family = AF_INET;
        addr.sin_addr.s_addr = inet_addr([[host address] UTF8String]);
        addr.sin_port = htons( 2001 );

        int conn = connect(sockfd, &addr, sizeof(addr)); 

        if (!conn) {

            NSData* data = [cmd dataUsingEncoding:NSISOLatin1StringEncoding];

            ssize_t datasend = send(sockfd, [data bytes], [data length], 0);
            datasend++;

            //ssize_t   send(int, const void *, size_t, int) __DARWIN_ALIAS_C(send);

            close(sockfd);

        } else {
            // create a popup here!

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[@"Connection failed to host " stringByAppendingString:hostname] message:@"Please check the hostname in the preferences." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
            [alert release];
        }

    } else {

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:[@"Could not look up host " stringByAppendingString:hostname] message:@"Please check the hostname in the preferences." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        [alert release];
    }

}

另一张海报还建议使用此库:entropydb - SocketWrapper