Использование API сокетов на IPhone - PullRequest
2 голосов
/ 12 марта 2010

для небольшого проекта я должен выполнить следующую задачу на моем IPhone:

  • открыть сокет TCP
  • отправить команду на сервер
  • отключить ЗАПИСЬ часть соединения
  • читать ответ с сервера
  • закрыть соединение

У меня нет опыта программирования сокетов - я только начал с сетевого программирования и уже использовал интерфейс CFStream. Но очевидно, что потоки не подходят для этой задачи.

Кто может указать мне правильное направление? Я пытался найти учебник на веб-сайте Apple о сокетах, но там ничего нет.

Ответы [ 2 ]

2 голосов
/ 04 декабря 2011

Взгляните на CoreFoundation CFSocket . Вы можете легко интегрировать его в цикл выполнения вашего приложения, чтобы не было проблем с потоками. Эта бесплатная книжная выдержка показывает, как ее использовать.

CFSocket - это обертка вокруг сокета bsd, позволяющая получить доступ к необработанному дескриптору сокета, если вам когда-либо понадобится установить специальные параметры сокета (например, многоадресная передача).

Если вы открыты для использования сторонних библиотек, CocoaAsyncSocket кажется хорошим решением (никогда не пробовал сам).

1 голос
/ 12 марта 2010

Я не разработчик для iPhone, но мне был любопытен ваш вопрос, поэтому я осмотрелся вокруг.

Я нашел эту страницу: Разъемы на 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...