Thomas M
Thomas M

Reputation: 21

Using socket API on IPhone

for a little project I have to do the following task on my IPhone:

I'm not experienced with socket programming - I've just started with network programming and I've already used the CFStream interface. But obviously streams are not adequate for this task.

Who can point me in the right direction? I tried to find a tutorial on Apples website about sockets, but there is nothing.

Upvotes: 2

Views: 10814

Answers (2)

Emile Cormier
Emile Cormier

Reputation: 29229

Take a look at CoreFoundation's CFSocket. You can integrate it easily into your app's run loop, so there's no messing around with threads. This free book excerpt shows you how to use it.

CFSocket is a wrapper around a bsd socket, and lets you access the raw socket handle if ever you need to set special socket options (such as multicast).

If you're open to using 3rd-party libraries, CocoaAsyncSocket seems like a nice solution (never tried it myself).

Upvotes: 2

Codesleuth
Codesleuth

Reputation: 10541

I'm not an iPhone developer, but I was curious about your question so I had a look around.

I found this page: Sockets on iPhone

Here's the code:

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

}

A poster goes on to also suggest this library: entropydb - SocketWrapper

Upvotes: 1

Related Questions