我想与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重新连接到池)
一直在做一些谷歌搜索和一些关于这个主题的阅读,但无论我花了多少时间搜索,似乎无法做到正确.
我想要做的是通过宣传我对他们提供的服务的兴趣来接收在我的网络上连接的设备的广播消息.使用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) 我目前正在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) 我试图在我的 iOS7 应用程序中通过 UDP 向已知 IP 发送一个简单的字符串,但找不到有关如何执行此操作的简单解释和示例代码。有很多关于 TCP 的内容,但关于 UDP 的内容不多,在我的情况下它必须是 UDP。
我有一个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).那我怎样才能解析多个对等体地址/如何为多个设备建立连接.所以我的怀疑是: -
我在为 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)