iphone上的本地vs远程套接字连接

时间:2010-01-28 18:23:59

标签: iphone sockets udp wifi

我想通过创建并连接到udp套接字,将OSC消息从iphone发送到另一个程序(max / msp)。这可以在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])
    {

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

之后从app delegate调用此方法
-(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 个答案:

答案 0 :(得分:1)

更改;

in_addr_t myAddress = 0xC0A80145

in_addr_t myAddress = inet_addr("192.168.1.2");

或者IP是什么。

S上。

答案 1 :(得分:1)

除非我误解你试图用INADDR_ANY作为服务器地址连接。 INADDR_ANY仅供侦听服务器告知IP堆栈它想要侦听任何网络接口(而不是多宿主计算机上的特定接口)。 )客户端需要服务器的显式服务器地址来发送数据包。查看inet_pton函数,了解如何将IP地址从字符串转换为网络表示。