下面是编程之家 jb51.cc 通过网络收集整理的代码片段。
编程之家小编现在分享给大家,也给大家做个参考。
#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,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,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,serverThread,NULL); }
以上是编程之家(jb51.cc)为你收集整理的全部代码内容,希望文章能够帮你解决所遇到的程序开发问题。
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。