iOS7 アプリで UDP 経由で単純な文字列を既知の IP に送信しようとしていますが、その方法に関する簡単な説明とサンプル コードが見つかりませんでした。TCP についてはたくさんありますが、UDP についてはそれほど多くはなく、私の場合は UDP でなければなりません。
質問する
9689 次
2 に答える
3
TCP および UDP 接続用の Objective-C ラッパーであるhttps://github.com/robbiehanson/CocoaAsyncSocketを使用できます。また、TCP および UPD クライアントとサーバーのサンプル コードも含まれています。
于 2014-01-18T17:44:14.083 に答える
2
このラッパーのないシンプルな要点を使用できます。
UDPEchoClient.h
#import <Foundation/Foundation.h>
@interface UDPEchoClient : NSObject
- (BOOL) sendData:(const char *)msg;
@end
UDPEchoClient.m
#import "UDPEchoClient.h"
//
// CFSocket imports
//
#import <CoreFoundation/CoreFoundation.h>
#import <sys/socket.h>
#import <arpa/inet.h>
#import <netinet/in.h>
#define IP "host ip"
#define PORT host_port
static void dataAvailableCallback(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) {
//
// receiving information sent back from the echo server
//
CFDataRef dataRef = (CFDataRef)data;
NSLog(@"data recieved (%s) ", CFDataGetBytePtr(dataRef));
}
@implementation UDPEchoClient
{
//
// socket for communication
//
CFSocketRef cfsocketout;
//
// address object to store the host details
//
struct sockaddr_in addr;
}
- (instancetype)init
{
self = [super init];
if (self) {
//
// instantiating the CFSocketRef
//
cfsocketout = CFSocketCreate(kCFAllocatorDefault,
PF_INET,
SOCK_DGRAM,
IPPROTO_UDP,
kCFSocketDataCallBack,
dataAvailableCallback,
NULL);
memset(&addr, 0, sizeof(addr));
addr.sin_len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = inet_addr(IP);
//
// set runloop for data reciever
//
CFRunLoopSourceRef rls = CFSocketCreateRunLoopSource(kCFAllocatorDefault, cfsocketout, 0);
CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopCommonModes);
CFRelease(rls);
}
return self;
}
//
// returns true upon successfull sending
//
- (BOOL) sendData:(const char *)msg
{
//
// checking, is my socket is valid
//
if(cfsocketout)
{
//
// making the data from the address
//
CFDataRef addr_data = CFDataCreate(NULL, (const UInt8*)&addr, sizeof(addr));
//
// making the data from the message
//
CFDataRef msg_data = CFDataCreate(NULL, (const UInt8*)msg, strlen(msg));
//
// actually sending the data & catch the status
//
CFSocketError socketErr = CFSocketSendData(cfsocketout,
addr_data,
msg_data,
0);
//
// return true/false upon return value of the send function
//
return (socketErr == kCFSocketSuccess);
}
else
{
NSLog(@"socket reference is null");
return false;
}
}
于 2016-06-23T13:09:47.210 に答える