【问题标题】:local vs remote socket connections on iphoneiphone上的本地与远程套接字连接
【发布时间】:2010-01-28 18:23:58
【问题描述】:

我想通过创建并连接到 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;

// 这个方法是在初始化后从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

任何帮助将不胜感激

【问题讨论】:

    标签: iphone sockets udp wifi


    【解决方案1】:

    改变;

    in_addr_t myAddress = 0xC0A80145
    

    in_addr_t myAddress = inet_addr("192.168.1.2");
    

    或任何IP。

    S.

    【讨论】:

    • 非常感谢。这很有魅力!我是新手。有关套接字编程的良好资源的任何提示?我知道那里有很多东西,但只是想知道你是否特别喜欢任何东西。延迟将是我的应用程序的一个问题。如何减少这种情况?
    • 对于低级套接字 API,我认为这是最好的书籍之一 amazon.com/UNIX-Network-Programming-Networking-Sockets/dp/…
    【解决方案2】:

    除非我误解了您正在尝试使用INADDR_ANY 作为服务器地址进行连接。 INADDR_ANY 仅用于监听服务器告诉 IP 堆栈它想要监听 any 网络接口(相对于多宿主计算机上的 特定 接口)。客户端需要服务器的显式服务器地址才能将数据包发送到。查看inet_pton函数如何将IP地址从字符串转换为网络表示。

    【讨论】:

    • 感谢您的信息。默认情况下,它必须只是在我在“localhost”上指定的端口触发数据,这可能就是它在模拟器中工作的原因。
    猜你喜欢
    • 2020-09-25
    • 1970-01-01
    • 2011-02-09
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    相关资源
    最近更新 更多