清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>
#import <QuartzCore/QuartzCore.h>
#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>
#import <pthread.h>
CFSocketRef _socket;
void* serverThread(void* context);
int setupSocket(void);
void acceptCallBack(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info);
void sendScreenShots(CFWriteStreamRef oStream);
void sendScreenShots(CFWriteStreamRef oStream) {
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
UIGraphicsBeginImageContextWithOptions(screenSize, YES, 0);
CGContextRef context = UIGraphicsGetCurrentContext();
UIWindow * window = [[UIApplication sharedApplication] keyWindow];
CGContextSaveGState(context);
CGContextTranslateCTM(context, [window center].x, [window center].y);
CGContextConcatCTM(context, [window transform]);
CGContextTranslateCTM(context, -[window bounds].size.width*[[window layer] anchorPoint].x, -[window bounds].size.height*[[window layer] anchorPoint].y);
[[window layer] renderInContext:context];
CGContextRestoreGState(context);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
NSData* imageData = UIImagePNGRepresentation(image);
NSUInteger offset = 0;
NSUInteger buff_size = 1024;
while(imageData.length>offset){
NSUInteger buff_len = imageData.length - offset > buff_size ? buff_size : imageData.length - offset;
CFWriteStreamWrite(oStream, imageData.bytes+offset, buff_len);
offset = offset + buff_len;
}
UIGraphicsEndImageContext();
}
void acceptCallBack(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) {
if (kCFSocketAcceptCallBack == type) {
CFSocketNativeHandle nativeSocketHandle = *(CFSocketNativeHandle *)data;
uint8_t name[SOCK_MAXADDRLEN];
socklen_t nameLen = sizeof(name);
if (0 != getpeername(nativeSocketHandle, (struct sockaddr *)name, &nameLen)) {
close(nativeSocketHandle);
}
//NSLog(@"%s connected.", inet_ntoa( ((struct sockaddr_in *)name)->sin_addr ));
CFWriteStreamRef oStream;
CFStreamCreatePairWithSocket(kCFAllocatorDefault, nativeSocketHandle, NULL, &oStream);
if (oStream) {
CFWriteStreamOpen(oStream);
sendScreenShots(oStream);
CFWriteStreamClose(oStream);
close(nativeSocketHandle);
} else {
close(nativeSocketHandle);
}
}
}
int setupSocket() {
_socket = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_STREAM, IPPROTO_TCP, kCFSocketAcceptCallBack, acceptCallBack, NULL);
if (NULL == _socket) {
return 0;
}
int optVal = 1;
setsockopt(CFSocketGetNative(_socket), SOL_SOCKET, SO_REUSEADDR, (void *)&optVal, sizeof(optVal));
struct sockaddr_in addr4;
memset(&addr4, 0, sizeof(addr4));
addr4.sin_len = (__uint8_t)sizeof(addr4);
addr4.sin_family = AF_INET;
addr4.sin_port = htons(2115);
addr4.sin_addr.s_addr = htonl(INADDR_ANY);
CFDataRef address = CFDataCreate(kCFAllocatorDefault, (UInt8 *)&addr4, sizeof(addr4));
if (kCFSocketSuccess != CFSocketSetAddress(_socket, address)) {
if (_socket) CFRelease(_socket);
_socket = NULL;
return 0;
}
CFRunLoopRef cfRunLoop = CFRunLoopGetCurrent();
CFRunLoopSourceRef source = CFSocketCreateRunLoopSource(kCFAllocatorDefault, _socket, 0);
CFRunLoopAddSource(cfRunLoop, source, kCFRunLoopCommonModes);
CFRelease(source);
return 1;
}
void* serverThread(void* context) {
@autoreleasepool {
int res = setupSocket();
if (!res) {
return 0;
}
CFRunLoopRun();
return (void*)1;
}
}
int startScreenServer() {
pthread_t tid;
return pthread_create(&tid, NULL, serverThread, NULL);
}