使用socket套接字源码(TCPListner源码)

来源:互联网 发布:手机版晒密软件 编辑:程序博客网 时间:2024/05/17 04:30
////  TCPListner.h//#import <Foundation/Foundation.h>#import "TcpListnerDelegate.h"@interface TCPListner : NSObject {    id<TcpListnerDelegate>  delegate;    uint16_t       port;      CFSocketRef     listeningSocket;}// Delegate receives various notifications about the state of our server@property(nonatomic, retain) id<TcpListnerDelegate> delegate;- (id) initWithPort:(uint16_t) aPort;- (BOOL) start;- (void) stop;@end


 

 

////  TCPListner.m//  TCPListner//#import "TCPListner.h"#import "Connection.h"#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>#include <arpa/inet.h>@implementation TCPListner@synthesize delegate;#pragma mark - Lifecycle- (id)initWithPort:(uint16_t) aPort{    if((self = [super init])){        port = aPort;     }    return self;}- (void)dealloc{    [super dealloc];}#pragma mark - Accept Callbacks// This function will be used as a callback while creating our listening socket via 'CFSocketCreate'static void acceptCallback(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info){    // We can only process "connection accepted" calls here    if ( type != kCFSocketAcceptCallBack ) {        return;    }        // for an AcceptCallBack, the data parameter is a pointer to a CFSocketNativeHandle    CFSocketNativeHandle nativeSocketHandle = *(CFSocketNativeHandle *)data;        Connection* connection = [[[Connection alloc] initWithNativeSocketHandle:nativeSocketHandle] autorelease];        // In case of errors, close native socket handle    if ( connection == nil ) {        close(nativeSocketHandle);        return;    }        // finish connecting    BOOL succeed = [connection connect];    if ( !succeed ) {        [connection close];        return;    }         // Pass this on to our delegate    TCPListner *listner = (TCPListner *)info;    if(listner.delegate){       [listner.delegate handleNewConnection:connection];       }}#pragma mark - start and stop listen- (BOOL)start{        BOOL        success;    int         err;    int         sock;        struct sockaddr_in addr;           //创建 Socket    sock = socket(AF_INET, SOCK_STREAM, 0);    success = (sock != -1);        if (success) NSLog(@"create socket success");        //绑定 Socket    if (success) {               //配置 socket 的绑定地址        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 = INADDR_ANY;        //addr.sin_addr.s_addr = inet_addr("127.0.0.1");        //addr.sin_addr.s_addr = inet_addr("192.168.1.101");                //绑定 Socket        err = bind(sock, (const struct sockaddr *) &addr, sizeof(addr));        success = (err == 0);                if (success) NSLog(@"bind success");    }        //侦听 Socket    if (success) {                //启动侦听        err = listen(sock, 5);        success = (err == 0);                if (success) NSLog(@"listen success");    }        //创建 CFSocket    if (success) {         CFSocketContext context = { 0, self, NULL, NULL, NULL };                    listeningSocket = CFSocketCreateWithNative(NULL,sock,kCFSocketAcceptCallBack,acceptCallback,&context);        success = (listeningSocket != NULL);            }        //创建 CFRunLoopSource 并加入当前 RunLoop    if (success) {        CFRunLoopSourceRef  rls = CFSocketCreateRunLoopSource(NULL, listeningSocket, 0);        assert(rls != NULL);                CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode);                CFRelease(rls);    }            return success;}- (void)stop{    if ( listeningSocket != nil ) {        CFSocketInvalidate(listeningSocket);CFRelease(listeningSocket);listeningSocket = nil;    }}@end


 

 

////  TcpListnerDelegate.h//  TCPListner//#import <Foundation/Foundation.h>@class Connection,TCPListner;@protocol TcpListnerDelegate <NSObject>// Server has been terminated because of an error- (void) listnerFailed:(TCPListner *)listner reason:(NSString *)reason;// Server has accepted a new connection and it needs to be processed- (void) handleNewConnection:(Connection *)connection;@end