使用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
- 使用socket套接字源码(TCPListner源码)
- 使用socket套接字源码(Connection源码)
- 套接字源码分析
- Windows套接字(Socket)例子(源码,实例)
- Socket(套接字)
- Socket(套接字)
- Socket(套接字)
- Socket(套接字)
- Socket(套接字)
- socket(套接字)
- socket套接字使用范例
- socket套接字的使用
- SOCKET套接字入门实例 附带源码
- 使用TCP/IP的套接字(Socket)进行通信
- 使用TCP/IP的套接字(Socket)进行通信
- 使用TCP/IP的套接字(Socket)进行通信
- 使用TCP/IP的套接字(Socket)进行通信
- 使用TCP/IP的套接字(Socket)进行通信
- poj 2778 (AC自动机+dp+矩阵快速幂)
- php文件上传
- 使用socket套接字源码(Connection源码)
- WHU 2013 Summer Contest #12 - 2013 ACM-ICPC通化邀请赛 [xioumu]
- 反人类反社会的二进制运算
- 使用socket套接字源码(TCPListner源码)
- Disable autostart of Oracle-xe in Ubuntu
- 点到线段的距离
- 第十四章 python标准库
- 网易游戏2011.10.15校招--笔试题
- 淡淡飞浪-与零为友
- 国外大学生谈经验:如何在Github参与开源(Open Source on Github: Your First Contribution)
- linux网络epoll()函数 有道翻译
- OceanBase要求的gcc版本