3

udpソケットを作成して接続することにより、iPhoneから別のプログラム(max / msp)にOSCメッセージを送信したいと思います。これはiphoneシミュレーターから機能します。つまり、両方のアプリが同じコンピューターで実行されている場合は機能しますが、電話自体にアプリをインストールした場合は機能しません。

リモートコンピュータのIPを指定することに問題があるのではないかと思います。sockaddr_in構造体を使用してIPとポート情報を指定しています。シミュレーターでコードを実行するときは、IPをINADDR_ANYとして指定しても問題ありません。

sin_addr.s_addr = INADDR_ANY;

デバイスで実行すると、IPを16進数に変換し、INADDR_ANYの代わりにそれを指定しようとしています。これは、シミュレーターでもデバイスでも機能しません。

コンソールは、ソケットが接続してデータを正常に送信していることを示していますが、リモートプログラム(max / msp)はデータをまったく受信していません。

デバイスとシミュレーターの両方で機能するように、適切なフレームワークをインポートしてみました。

完全なコードは次のとおりです。

「UDPSocketCreate.h」をインポートします

@implementation UDPSocketCreate

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

//addrはタイプstructsockaddr_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

どんな助けでも大歓迎です

4

2 に答える 2

1

変化する;

in_addr_t myAddress = 0xC0A80145

in_addr_t myAddress = inet_addr("192.168.1.2");

またはそのIPが何であれ。

S.

于 2010-01-28T19:02:45.697 に答える
1

INADDR_ANYサーバーアドレスとして接続しようとしていると誤解しない限り。リッスン サーバーが任意のネットワーク インターフェイスINADDR_ANYでリッスンすることを IP スタックに通知するためだけです(マルチホーム マシン上の特定のインターフェイスとは対照的です)。クライアントは、パケットを送信するサーバーの明示的なサーバー アドレスを必要とします。IP アドレスを文字列からネットワーク表現に変換する方法については、関数を参照してください。inet_pton

于 2010-01-28T19:04:56.057 に答える