#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;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货