2010-01-28 2 views
3

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

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

sin_addr.s_addr = INADDR_ANY;

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

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

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

полный код следующим образом:

импорта "UDPSocketCreate.h"

@implementation UDPSocketCreate 

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

// адр является переменной экземпляра структуры 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; 

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

-(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 

вся справка была бы принята с благодарностью

ответ

1

Изменить;

in_addr_t myAddress = 0xC0A80145 

в

in_addr_t myAddress = inet_addr("192.168.1.2"); 

или независимо от того, что IP является.

С.

+0

много спасибо. что сработало очарование! Я новичок в этом. любые советы по хорошим ресурсам в программировании сокетов? Я знаю, что там есть грузы, но просто интересно, любите ли вы кого-либо в частности. латентность будет проблемой для моего приложения. как свести это к минимуму? – Remover

+0

Для низкоуровневых API-интерфейсов я думаю, что это одна из лучших доступных книг http://www.amazon.com/UNIX-Network-Programming-Networking-Sockets/dp/013490012X –

+0

wohh! выглядит как большой. спасибо – Remover

1

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

+0

благодарит за информацию. это должен быть просто запуск данных в порту, который я укажу на «localhost» по умолчанию, возможно, поэтому он работает в симуляторе. – Remover

 Смежные вопросы

  • Нет связанных вопросов^_^