#import "SocketController.h"
#import <netinet/in.h>
#import <sys/socket.h>
#import <arpa/inet.h>
#import <CFNetwork/CFSocketStream.h>
#define PORT 8888
#define IPADDRESS "192.168.11.43"
static void socketCallBack(CFSocketRef s,CFSocketCallBackType type,CFDataRef address,const void *dataIn,void *info){

SocketController *socketController = (SocketController *)info;
//SocketController *socketController = [[SocketController alloc]init];
    if (flag=YES) {
NSLog(@"Hello7");
if(type == kCFSocketConnectCallBack){

if(dataIn){
SInt32 error = *((SInt32*)dataIn);
NSLog(@"error code %d",error);
}else {
type = kCFSocketDataCallBack;
}
}
if(type == kCFSocketDataCallBack){

CFSocketNativeHandle nativeSocketHandle = *(CFSocketNativeHandle *)info;
CFReadStreamRef readStream = nil;
CFWriteStreamRef writeStream = nil;
CFStreamCreatePairWithSocket(kCFAllocatorDefault, nativeSocketHandle,          &readStream,        &writeStream);

if(readStream && writeStream){

CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);



inStream = (NSInputStream *)readStream;
[inStream retain];
[inStream setDelegate:[socketController self]];
[inStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[inStream open];

outStream = (NSOutputStream *)writeStream;
[outStream retain];
[outStream setDelegate:[socketController self]];
[outStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
 forMode:NSDefaultRunLoopMode];
[outStream open];


//发送数据向服务器
uint8_t message;
NSInteger bytesWritten;
if([outStream hasSpaceAvailable]){
bytesWritten=[outStream write:(const uint8_t *)message maxLength:sizeof(const uint8_t)]; 

}
NSLog(@"byteWritten=%d",bytesWritten);
//if(-1 == bytesWritten) NSLog(@"error is:%d",);
//else {
//NSLog(@"Print string is:%d",buf);
//}
}/*else {
  //close(nativeSocketHandle);
  NSLog(@"Hello12");
  }*/
if (readStream) {
CFRelease(readStream);
}
if(writeStream) {
CFRelease(writeStream);
}
}
}
}@implementation SocketController
- (CFSocketRef)initSocket {

CFSocketContext context = {
.version = 0,
.info = self,
.retain = nil,
.release = nil,
.copyDescription = nil
};
//NSLog(@"Hello4");
CFSocketRef socket = CFSocketCreate(
kCFAllocatorDefault, 
PF_INET,
SOCK_STREAM,
IPPROTO_TCP,
kCFSocketDataCallBack^kCFSocketConnectCallBack,
socketCallBack,//回调函数 
&context
);

uint16_t port = PORT;

struct sockaddr_in addr4;

memset(&addr4,0,sizeof(addr4));
addr4.sin_family = AF_INET;
addr4.sin_len = sizeof(addr4);
addr4.sin_port = htons(port);

const char* ipAddress = IPADDRESS;

inet_aton(ipAddress, &addr4.sin_addr);

NSData *address = [NSData dataWithBytes:&addr4 length:sizeof(addr4)];
NSLog(@"Hello5");
    
CFSocketConnectToAddress(socket, (CFDataRef)address, -1);
flag=YES;
    
CFRunLoopSourceRef source;
source = CFSocketCreateRunLoopSource(nil, socket, 1);
CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
CFRelease(source);
NSLog(@"Hello6");
//NSLog(@"function address is:%d",&socketCallBack);
//NSLog(@"socket address is:%d",&socket);
//NSLog(@"value is:%d",kCFSocketDataCallBack^kCFSocketConnectCallBack);
return socket;

}