локальные и удаленные соединения на iphone - PullRequest
3 голосов
/ 28 января 2010

Я хочу отправлять сообщения OSC с iphone в другую программу (max / msp), создавая и подключаясь к сокету udp. это работает с симулятора iphone, т.е. когда оба приложения работают на одном компьютере, но не когда я устанавливаю приложение на самом телефоне.

Я думаю, что проблема может быть связана с указанием IP-адреса удаленного компьютера. Я использую структуру sockaddr_in, чтобы указать IP и информацию о порте. когда я запускаю код в симуляторе, можно указать IP как INADDR_ANY:

sin_addr.s_addr = INADDR_ANY;

когда я запускаю его на устройстве, я пытаюсь преобразовать свой IP в шестнадцатеричное число и указываю его вместо INADDR_ANY. Это не работает ни для симулятора, ни для устройства.

Консоль показывает, что сокет нормально подключается и отправляет данные, но удаленная программа (max / msp) вообще не получает никаких данных.

Я попытался импортировать нужные фреймворки, чтобы они работали как на устройстве, так и на симуляторе.

полный код:

import "UDPSocketCreate.h"

@implementation UDPSocketCreate

-(id)init
{
    in_addr_t myAddress = 0xC0A80145;
    if(self =[super init])
    {

// addr является переменной экземпляра типа struct sockaddr_in

        memset(&addr, 0, sizeof(addr));
        addr.sin_len = sizeof(addr); 
        addr.sin_family = PF_INET;
        addr.sin_port = htons(3333);
        addr.sin_addr.s_addr = myAddress;INADDR_ANY
        connectAddr = CFDataCreate(NULL, (unsigned char *)&addr, sizeof(addr));

        OSC_initBuffer(&myOSCBuff, sizeof(packetBuffer), packetBuffer);

        NSString *address = @"/test";
        const char *utf8Address = [address UTF8String];
        int addressResult = OSC_writeAddress(&myOSCBuff, (char*)utf8Address);       
    }

    return self;

}


CFSocketRef udpSocket;

// этот метод вызывается из делегата приложения после init

-(void)createUDPSocketRef
{


    udpSocket = CFSocketCreate(NULL, PF_INET, SOCK_DGRAM, IPPROTO_UDP, kCFSocketWriteCallBack, myCallBack, NULL);
    if(udpSocket == NULL)
    {       
        NSLog(@"socket create failed");  
        return;
    }

    CFRunLoopSourceRef runLoopSrceRef = CFSocketCreateRunLoopSource(NULL, udpSocket, 1);

    CFRunLoopRef rl = CFRunLoopGetCurrent();

    CFRunLoopAddSource(rl, runLoopSrceRef, kCFRunLoopCommonModes);

}

// pressing a button on the UI triggers this method
-(void)bang
{   
    int myInt = 1;  

    int writeRestult = OSC_writeIntArg(&myOSCBuff, myInt);  

    int buffDoneResult;
    if (buffDoneResult = OSC_isBufferDone(&myOSCBuff))
    {
        NSLog(@"valid message in buff");        
        char *pack = OSC_getPacket(&myOSCBuff);
        int packSize = OSC_packetSize(&myOSCBuff);          

        CFDataRef OSCPacketWithAddressTest = CFDataCreate(NULL, pack, packSize);


        CFSocketError sendError = CFSocketSendData(udpSocket, connectAddr, OSCPacketWithAddressTest, 30);
        NSLog(@"send error: %d", sendError);
    }

    OSC_resetBuffer(&myOSCBuff);
    NSString *address = @"/test";
    const char *utf8Address = [address UTF8String];
    int addressResult = OSC_writeAddress(&myOSCBuff, (char*)utf8Address);   

}

@end

любая помощь будет принята с благодарностью

Ответы [ 2 ]

1 голос
/ 28 января 2010

Если я не правильно понял, вы пытаетесь подключиться с INADDR_ANY в качестве адреса сервера. INADDR_ANY только для прослушивающего сервера, который сообщает IP-стеку, что он хочет прослушивать любой сетевой интерфейс (в отличие от определенного интерфейса на многосетевой машине.) Требуется клиент явный адрес сервера, на который отправляются пакеты. Посмотрите на функцию inet_pton, как преобразовать IP-адрес из символьной строки в сетевое представление.

1 голос
/ 28 января 2010

Изменение;

in_addr_t myAddress = 0xC0A80145

до

in_addr_t myAddress = inet_addr("192.168.1.2");

или каков этот IP-адрес.

S.

...