Last active
January 9, 2022 10:33
-
-
Save ratulSharker/3b6bce0debe77fd96344e14566b23e06 to your computer and use it in GitHub Desktop.
UDP Echo client using objective-c CFSocket
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#import <Foundation/Foundation.h> | |
@interface UDPEchoClient : NSObject | |
- (BOOL) sendData:(const char *)msg; | |
@end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment