Skip to content

Instantly share code, notes, and snippets.

@assertchris
Created April 8, 2011 15:46
Show Gist options
  • Save assertchris/910147 to your computer and use it in GitHub Desktop.
Save assertchris/910147 to your computer and use it in GitHub Desktop.
Simple Socket wrapper class for Objective-C
// simple socket wrapper class for objective-c
// SocketController.h
#import <Foundation/Foundation.h>
#import <netinet/in.h>
#import <sys/socket.h>
#import <arpa/inet.h>
@protocol SocketControllerDelegate
- (void) onSocketControllerConnect;
- (void) onSocketControllerError: (int) error;
@optional
- (void) onSocketControllerData: (NSMutableData *) data;
- (void) onSocketControllerMessage: (NSString *) message;
@end
@interface SocketController : NSObject {
id <SocketControllerDelegate> _delegate;
CFSocketRef _socket;
}
- (id) initWithIPAddress: (const char *) ip port: (int) port delegate: (id <SocketControllerDelegate>) delegate;
- (void) onConnect;
- (void) onError: (int) error;
- (void) onData: (NSMutableData *) data;
- (void) sendString: (NSString *) message;
@end
// SocketController.m
#import "SocketController.h"
@implementation SocketController
static void socketCallBack(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void * data, void * info)
{
SocketController * socketController = (SocketController *) info;
if (type == kCFSocketConnectCallBack)
{
if (data)
{
[socketController onError: (int) data];
}
else
{
[socketController onConnect];
}
return;
}
if (type == kCFSocketDataCallBack)
{
[socketController onData: (NSMutableData *) data];
}
}
- (void) dealloc
{
if (_socket)
{
CFSocketInvalidate(_socket);
_socket = nil;
}
[super dealloc];
}
- (id) initWithIPAddress: (const char *) ip port: (int) port delegate: (id <SocketControllerDelegate>) delegate
{
if ((self = [super init]))
{
_delegate = delegate;
CFSocketContext context = {
.version = 0,
.info = self,
.retain = NULL,
.release = NULL,
.copyDescription = NULL
};
_socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketDataCallBack ^ kCFSocketConnectCallBack, socketCallBack, &context);
struct sockaddr_in addr4;
memset(&addr4, 0, sizeof(addr4));
addr4.sin_family = AF_INET;
addr4.sin_len = sizeof(addr4);
addr4.sin_port = htons(port);
inet_aton(ip, &addr4.sin_addr);
NSData * address = [NSData dataWithBytes: &addr4 length: sizeof(addr4)];
CFSocketConnectToAddress(_socket, (CFDataRef) address, -1);
CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(NULL, _socket, 1);
CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
CFRelease(source);
}
return self;
}
- (void) onConnect
{
if (_delegate)
{
[_delegate onSocketControllerConnect];
}
}
- (void) onError: (int) error
{
if (_delegate)
{
[_delegate onSocketControllerError: error];
}
}
- (void) onData: (NSMutableData *) data
{
if (_delegate && [(id) _delegate respondsToSelector: @selector(onSocketControllerMessage:)])
{
[_delegate onSocketControllerMessage: [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]];
}
if (_delegate && [(id) _delegate respondsToSelector: @selector(onSocketControllerData:)])
{
[_delegate onSocketControllerData: data];
}
}
- (void) sendString: (NSString *) message
{
const char * sendStrUTF = [message UTF8String];
NSData * data = [NSData dataWithBytes: sendStrUTF length: strlen(sendStrUTF)];
CFSocketError error = CFSocketSendData(_socket, NULL, (CFDataRef) data, 0);
if (error > 0 && _delegate)
{
[_delegate onSocketControllerError: error];
}
}
@end
// viewController.h
#import <UIKit/UIKit.h>
#import "SocketController.h"
@interface viewController : UIViewController <SocketControllerDelegate> {
SocketController * socketController;
}
@end
// viewController.m
#import "viewController.h"
@implementation viewController
- (void) dealloc
{
[socketController release];
[super dealloc];
}
- (void) viewDidLoad
{
[super viewDidLoad];
socketController = [[SocketController alloc] initWithIPAddress: "0.0.0.0" port: 00000 delegate: self];
}
- (void) onSocketControllerConnect
{
NSLog(@"onSocketControllerConnect");
[socketController sendString: @"Login user\n"];
}
- (void) onSocketControllerError: (int) error
{
NSLog(@"onSocketControllerError");
NSLog(@"onSocketControllerError: %d", error);
}
- (void) onSocketControllerMessage: (NSString *) message
{
NSLog(@"onSocketControllerMessage: %@", message);
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment