开发者

local vs remote socket connections on iphone

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];
    开发者_如何学Python    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


Change;

in_addr_t myAddress = 0xC0A80145

to

in_addr_t myAddress = inet_addr("192.168.1.2");

or whatever that IP is.

S.


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜