TCPsocket.h

//
//  TCPSocket.h
//  test
//
//  Created by Aden on 11-3-30.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
#import <unistd.h>



@interface TCPSocket : NSObject 
{
    CFSocketRef        _socket;        //套接字
//    NSMutableArray*    _bufferArray;    //缓冲数据保存

    float    _recvDt;                //接收时间间隔
    bool    _isDisConnect;            //连接是否断开
}

@property(nonatomic,readwrite,assign)CFSocketRef socket;
@property(nonatomic)bool    isDisConnect;
@property(nonatomic)float    recvDt;


//创建
+(id)CreateTCPSocket;
-(id)initTCPSocket;

//请求连接
-(void)doConnect:(NSString*)address port:(UInt16)port;

//发送消息
-(void)sendData:(void*)data;

//接收消息
-(void)recvData:(void*)data;

//关闭连接
-(void)closedSocket;

@end

TCPSocket.m

//
//  TCPSocket.m
//  test
//
//  Created by Aden on 11-3-30.
//  Copyright 2011 __MyCompanyName__. All rights reserved.
//
#import "TCPSocket.h"
//#import "SocketData.h"

///////////////////////////////////////////////////////////////
//连接回调函数
static void ConnectCallBack(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info)
{
    if (data != NULL) 
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"" message:@"连接失败" delegate:nil cancelButtonTitle:@"关闭" otherButtonTitles:nil];
        [alert show];
        [alert release];
        return;
    }
    TCPSocket *delegate = (TCPSocket*)info;
    [delegate performSelectorInBackground:@selector(recvData:) withObject:nil];
}
///////////////////////////////////////////////////////////////


#pragma mark TCPSocket

@implementation TCPSocket    

@synthesize    socket    = _socket;
@synthesize isDisConnect = _isDisConnect;
@synthesize recvDt    = _recvDt;

//分配内存
+(id)CreateTCPSocket
{
    return [[[TCPSocket alloc] initTCPSocket] autorelease];
}
-(id)initTCPSocket
{
    if( (self=[super init]) )
    {
        
        CFSocketContext CTX = {0, self, NULL, NULL, NULL};
        _socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketConnectCallBack, ConnectCallBack, &CTX);
        if(_socket==nil) NSLog(@"创建失败");
    
        _recvDt=0.0f;
        _isDisConnect=false;
        
        [NSTimer scheduledTimerWithTimeInterval:1.0f/60.0f target:self selector:@selector(socketUpdate:) userInfo:nil repeats:YES];
    }
    return self;
}
//计时刷新
-(void)socketUpdate:(float)dt
{
    _recvDt+=dt;
    
    //15秒内未有数据交互
    if(_recvDt>15.0)
    {
        _isDisConnect=false;
    }

}
//请求连接
-(void)doConnect:(NSString*)address port:(UInt16)port
{
    struct sockaddr_in addr4;
    memset(&addr4, 0, sizeof(addr4));
    addr4.sin_len = sizeof(addr4);
    addr4.sin_family = AF_INET;
    addr4.sin_port = htons(port);
    addr4.sin_addr.s_addr = inet_addr([address UTF8String]);
    CFDataRef addressData = CFDataCreate(kCFAllocatorDefault, (UInt8 *)&addr4, sizeof(addr4));
    
    CFSocketConnectToAddress(_socket, addressData, -1);

    CFRunLoopRef cfrl = CFRunLoopGetCurrent();
    CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _socket, 0);
    CFRunLoopAddSource(cfrl, source, kCFRunLoopCommonModes);
    CFRelease(source);
}

//发送消息
-(void)sendData:(void*)data 
{
    send(CFSocketGetNative(_socket), data, sizeof(data),0);
    _recvDt=0.0f;
}

//接收消息
-(void)recvData:(void*)data
{
    char buffer[255];
    while (recv(CFSocketGetNative(_socket), buffer, sizeof(buffer), 0)) 
    {
        NSLog(@"server:%d",buffer);
        data=buffer;
    }
}
//关闭连接
-(void)closedSocket
{
    
}

-(void)dealloc
{
    [super dealloc];
}
@end
posted on 2012-04-19 17:06  jeffery_lush  阅读(315)  评论(0编辑  收藏  举报