views:

366

answers:

2

I want to send OSC messages from iphone to another programme (max/msp) by creating and connecting to a udp socket. this works from the iphone simulator, i.e. when both apps are running on the same computer but not when i install the app on the phone itself.

I think the problem could be with specifying the IP of the remote computer. I am using the sockaddr_in struct to specify IP and port info. when i run the code in the simulator it is fine to specify the IP as INADDR_ANY:

sin_addr.s_addr = INADDR_ANY;

when i run it on the device i'm trying to convert my IP into a hexidecimal number and specifying that instead of INADDR_ANY. This doesn't work for either the simulator or the device.

The console shows that the the socket is connecting and sending data fine but the remote programme (max/msp) doesn't receive any data at all.

I have tried importing the right frameworks so that it should work on both device and simulator.

the full code follows:

import "UDPSocketCreate.h"

@implementation UDPSocketCreate

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

//addr is an instance variable of type 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;

// this method is called from app delegate after 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

any help would be greatly appreciated

+1  A: 

Change;

in_addr_t myAddress = 0xC0A80145

to

in_addr_t myAddress = inet_addr("192.168.1.2");

or whatever that IP is.

S.

St3fan
many thanks. that has worked a charm! I'm new to this. any tips for good resources on socket programming? I know that there's loads out there but just wondering if you are fond of any in particular. latency will be an issue for my application. how to minimise this?
Remover
For low level socket APIs I think this is one of the best books available http://www.amazon.com/UNIX-Network-Programming-Networking-Sockets/dp/013490012X
St3fan
wohh! looks like a big one. thanks
Remover
A: 

Unless I misunderstood you are trying to connect with INADDR_ANY as server address. INADDR_ANY is only for listening server to tell the IP stack that it wants to listen on any network interface (versus a specific interface on a multi-homed machine.) The client needs explicit server address of the server to send packets to. Look into inet_pton function for how to convert IP address from character string to network representation.

Nikolai N Fetissov
thanks for the info. it must be just firing data at the port i specify on 'localhost' by default which is maybe why it works in the simulator.
Remover