标签: cfsocket

IOS接收数据超时CFsocket

我想与pool.ntp.org连接以进行时间同步.所以创建一个套接字

    sock=CFSocketCreate(NULL, PF_INET, SOCK_DGRAM, IPPROTO_UDP, kCFSocketDataCallBack|kCFSocketWriteCallBack|kCFSocketConnectCallBack, sockCallback, &sock_ctx);
Run Code Online (Sandbox Code Playgroud)

然后我正在建立一个循环

    sockref=CFSocketCreateRunLoopSource(NULL, sock, 0);
CFRunLoopAddSource(CFRunLoopGetMain(), sockref, kCFRunLoopCommonModes);
Run Code Online (Sandbox Code Playgroud)

并连接到该地址

    CFDataRef adrref=CFDataCreate(NULL, (const UInt8 *)&adr, sizeof(adr));
    CFSocketError err=CFSocketConnectToAddress(sock, adrref,-1);
Run Code Online (Sandbox Code Playgroud)

如果我有回调kCFSocketWriteCallBack我发送所需的数据

        CFDataRef bufref=CFDataCreate(NULL, buffer, scl->NTP_PACKET_SIZE);
    CFSocketError error = CFSocketSendData(scl->sock, NULL, bufref,3);
Run Code Online (Sandbox Code Playgroud)

直到这里的一切都很完美.我的实际问题是

else if(callbackType==kCFSocketDataCallBack)
Run Code Online (Sandbox Code Playgroud)

9/10次正常工作.服务器发送响应,我的过程继续.问题是我在等待数据实际继续我的app逻辑.如果没有数据没有kCFSocketDataCallBack被触发和app等待永远.有没有办法让我在等待接收数据时超时?(没有自己NSTimer重新连接到池)

iphone ntp nstimer ios cfsocket

8
推荐指数
1
解决办法
1317
查看次数

在IOS上使用CFSocket进行UDP广播

一直在做一些谷歌搜索和一些关于这个主题的阅读,但无论我花了多少时间搜索,似乎无法做到正确.

我想要做的是通过宣传我对他们提供的服务的兴趣来接收在我的网络上连接的设备的广播消息.使用wireshark,我可以看到来自我想通过网络发送的网络设备的广播/通知消息,但不能通过我的广播搜索来查看他们服务的兴趣.但是通过网络实用程序,我可以看到套接字已创建,但不知道它处于哪种状态,无论是监听还是已连接.

是的,我知道我可以使用这些库来实现这一目标,但我想从头开始构建自己的东西,并更好地了解它是如何工作的.

MySocket.h

#import <Foundation/Foundation.h>
#import <CoreFoundation/CoreFoundation.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#if TARGET_OS_IPHONE
#import <CFNetwork/CFNetwork.h>
#endif

 @interface MySocket : NSObject
 {
    NSString* _message;
    CFSocketRef cfSocket;
    CFRunLoopSourceRef cfSource;

 }

 - (void)listen;
 @end
Run Code Online (Sandbox Code Playgroud)

MySocket.m

#import "MySocket.h"

#define MAX_UDP_DATAGRAM_SIZE 65507

@implementation MySocket


static void socketCallback(CFSocketRef cfSocket, CFSocketCallBackType
                           type, CFDataRef address, const void *data, void *userInfo)
{
    NSLog(@"socketCAllBAck was called");
}    

- (void)listen
{
    //Enable broadcast to network hosts        
    int yes = 1;
    int setSockResult = 0;
    _message = [[NSMutableString alloc …
Run Code Online (Sandbox Code Playgroud)

bsd ios cfsocket

5
推荐指数
1
解决办法
6073
查看次数

未调用CFSocket接受回调.我错过了什么?

我目前正在Objective-C中编写一个简单的TCP服务器类,它应该能够绑定并侦听特定端口.特别是我有一个-(void) start创建CFSockets 的函数,将它绑定到指定的端口并将其添加到运行循环中.它看起来像这样:

- (void) start {
    //This function is called after the initialiser

    if([self isStarted]) //if already started, return without doing anything
        return;


    //create a socket
    CFSocketContext socketCtxt = {0, (__bridge void *)self, NULL, NULL, NULL};
    socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketAcceptCallBack, (CFSocketCallBack)&SocketAcceptCallback, &socketCtxt);


    NSAssert(socket, @"Error: Cannot create a socket...");


    int yes = 1;
    setsockopt(CFSocketGetNative(socket), SOL_SOCKET, SO_REUSEADDR, (void *)&yes, sizeof(yes));


//bind it to the desired port
    struct sockaddr_in serverAddress;
    socklen_t nameLen = 0;
    nameLen = sizeof(serverAddress); …
Run Code Online (Sandbox Code Playgroud)

sockets objective-c callback ios cfsocket

5
推荐指数
0
解决办法
1221
查看次数

如何在 iOS7 的 UDP 套接字中发送字符串?

我试图在我的 iOS7 应用程序中通过 UDP 向已知 IP 发送一个简单的字符串,但找不到有关如何执行此操作的简单解释和示例代码。有很多关于 TCP 的内容,但关于 UDP 的内容不多,在我的情况下它必须是 UDP。

udp udpclient ios cfsocket ios7

5
推荐指数
1
解决办法
9666
查看次数

如何通过WiFi连接iPhone应用程序上的多个对等体?

我有一个ios(iPhone)应用程序的想法,需要连接到几个同行.我的代码基于WiTab(SampleCode-developer.apple.com)示例.

当我的应用程序启动时,每个对等体创建单独的Socket(CFSocket)并通过NSNetService Class发布.在特定实例NSNetServiceBrowser类中找到可用的对等体.并在TableView中显示其名称.当我在表视图中选择行解析相应的对等地址时,建立连接并成功发送 - 接收数据.

但我的意图是,我想在tableView中选择多行(多个对等).并解决了所选的对等地址.为此我将选定的对等体信息存储到NSMutableArray.当我单击(触摸)发送按钮时,我想解析所选设备地址并将数据发送到选定的对等点.为此,我做了这个代码

 for(int k=0;k<[selectedService count];k++)
    {

             self.currentResolve = [self.selectedService objectAtIndex:k];         
             self.currentResolve = [self.selectedSer objectAtIndex:k];     
             [self.currentResolve setDelegate:self];    
             [self.currentResolve resolveWithTimeout:60];           
  }
Run Code Online (Sandbox Code Playgroud)

但是它只会解析一个设备(self.selectedService objectAtIndex:0).那我怎样才能解析多个对等体地址/如何为多个设备建立连接.所以我的怀疑是: -

  1. 是否可以通过WiFi同时连接多个设备?
  2. 如果是,则可以以相同模式连接的最大设备数是多少?
  3. 哪种类型的CFSocket对多个连接(TCP/UDP)有用?
  4. 是否需要在每个对等体中创建多个CFSocket?
  5. 如果是,怎么样?他们的文件是什么?
  6. 是否需要建立会话?
  7. 如何解决mutple设备的地址?

objective-c wifi nsnetservice ios cfsocket

4
推荐指数
1
解决办法
2093
查看次数

在 Mac OS Hight Sierra 上创建和绑定套接字

我在为 Hight Sierra 的应用程序中创建套接字时遇到了严重而奇怪的问题。如果我创建命令行工具,一切正常!我创建套接字,绑定套接字。但是如果我尝试创建 Cocoa App,我无法绑定我的套接字!:(

如果我在 Cocoa App 中使用 CFSockets,

    char punchline[] = "MESSAGE from Server!";
    int yes = 1;

    CFSocketContext CTX = {0, punchline, NULL, NULL, NULL};

    CFSocketRef TCPServer = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketAcceptCallBack, (CFSocketCallBack) &AcceptCallBack, &CTX);


    if (TCPServer == NULL) return;

    setsockopt(CFSocketGetNative(TCPServer), SOL_SOCKET, SO_REUSEADDR, (void *) &yes, sizeof(yes));

    struct sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_len = sizeof(addr);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(33000);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);

    NSData *address = [NSData dataWithBytes:&addr length:sizeof(addr)];

    if (CFSocketSetAddress(TCPServer, (CFDataRef) address) …
Run Code Online (Sandbox Code Playgroud)

sockets macos objective-c cfnetwork cfsocket

4
推荐指数
1
解决办法
2514
查看次数

标签 统计

cfsocket ×6

ios ×5

objective-c ×3

sockets ×2

bsd ×1

callback ×1

cfnetwork ×1

ios7 ×1

iphone ×1

macos ×1

nsnetservice ×1

nstimer ×1

ntp ×1

udp ×1

udpclient ×1

wifi ×1