IOS中Socket常用处理

001    /* Send TCP transport data packet */    
002    void    
003    tcp_data_send(NSOutputStream *os, void *data, int length)    
004    {    
005        int sent, total = 0;    
006        while (total < length) {    
007            sent = [os write:data + total  maxLength:length - total];    
008            if (sent < 0) {    
009                error("send: %s\n", strerror(errno));    
010                return;    
011            }    
012            total += sent;    
013        }    
014    }    
015    
016    /* Receive TCP transport data packet */    
017    STREAM    
018    tcp_data_recv(NSInputStream *is, void *data, uint32 length)    
019    {    
020        int rcvd = 0;    
021    
022        while (length > 0)    
023        {    
024            rcvd = [is read:data maxLength:length];    
025            if (rcvd < 0)    
026            {    
027                error("recv: %s\n", strerror(errno));    
028                return NULL;    
029            }    
030            else if (rcvd == 0)    
031            {    
032                error("Connection closed\n");    
033                return NULL;    
034            }    
035    
036            data += rcvd;    
037            length -= rcvd;    
038        }    
039    
040        return data;    
041    }    
042    
043    /* Establish a TCP connection */    
044    BOOL    
045    tcp_establist_connect(NSInputStream *is, NSOutputStream *os, const char *server, int tcpPort)    
046    {    
047        is = nil;    
048        os = nil;    
049        CFReadStreamRef cfis = nil;    
050        CFWriteStreamRef cfos = nil;    
051        volatile ConnectionErrorCode errorCode;    
052    
053        CFStreamCreatePairWithSocketToHost(NULL,    
054                                           CFStringCreateWithCString(NULL, server, kCFStringEncodingASCII),    
055                                           tcpPort,    
056                                           &cfis,    
057                                           &cfos);    
058    
059        is = (NSInputStream *)cfis;    
060        os = (NSOutputStream *)cfos;    
061    
062        if (is == nil || os == nil)    
063        {    
064            errorCode = ConnectionErrorGeneral;    
065            return False;    
066        }    
067    
068        [is open];    
069        [os open];    
070    
071        // Wait until the output socket can be written to (this is the alternative to    
072        //  letting NSOutputStream block later when we do the first write:)    
073        time_t start = time(NULL);    
074        int timedOut = False;    
075        while (![os hasSpaceAvailable] && !timedOut && errorCode != ConnectionErrorCanceled)    
076        {    
077            usleep(1000); // sleep for a millisecond    
078            timedOut = (time(NULL) - start > TIMOUT_LENGTH);    
079        }    
080    
081        if (timedOut == True)    
082        {    
083            errorCode = ConnectionErrorTimeOut;    
084            return False;    
085        }    
086        else if (errorCode == ConnectionErrorCanceled)    
087        {    
088            return False;    
089        }    
090    
091        [is setDelegate:self];    
092        [is scheduleInRunLoop:inputRunLoop forMode:NSDefaultRunLoopMode];    
093    
094        return True;    
095    }    
096    
097    char *    
098    tcp_get_address(NSOutputStream *os)    
099    {    
100        CFWriteStreamRef stream;    
101        CFSocketNativeHandle socket;    
102        CFDataRef data;    
103    
104        stream = (CFWriteStreamRef)os;    
105        data = CFWriteStreamCopyProperty(stream, kCFStreamPropertySocketNativeHandle);    
106        socket = *(CFSocketNativeHandle *)CFDataGetBytePtr(data);    
107    
108        char *ipaddr = malloc(32);    
109        struct sockaddr_in sockaddr;    
110        socklen_t len = sizeof(sockaddr);    
111        if (getsockname(socket, (struct sockaddr *) &sockaddr, &len) == 0)    
112        {    
113            unsigned char *ip = (unsigned char *) &sockaddr.sin_addr;    
114            sprintf(ipaddr, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);    
115        }    
116        else    
117            strcpy(ipaddr, "127.0.0.1");    
118        return ipaddr;    
119    }    
120    
121    // Invoked on incoming data arrival, starts the processing of incoming packets    
122    - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)streamEvent    
123    {    
124        //...    
125    }
时间: 2025-01-03 20:02:30

IOS中Socket常用处理的相关文章

转:iOS中socket详解

一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要解决数据如何在网络

iOS中一些 常用的第三方库

转自ibireme的博客 做iOS开发总会接触到一些第三方库,这里整理一下,做一些吐槽. 目前比较活跃的社区仍旧是Github,除此以外也有一些不错的库散落在Google Code.SourceForge等地方.由于Github社区太过主流,这里主要介绍一下Github里面流行的iOS库. 首先整理了一份Github上排名靠前的iOS库(大概600个repos) 除了逛一下每日/每月流行之外,也可以到这里来看一下整个iOS Repos的排名. 下面是一些比较流行的第三方库: HTTP 相比较之下

iOS中MVC常用的结构策略

模型 概念 专门用来存放数据的对象 特点 一般直接继承自NSObject 在.h文件中声明一些用来存放数据的属性 模型定义示例 @interface Shop : NSObject /** 名字 */ @property (nonatomic, strong) NSString *name; /** 图标 */ @property (nonatomic, strong) NSString *icon; @end 字典转模型示例 Shop *shop = [[Shop alloc] init];

总结 iOS中一些常用的小方法

一.改变状态栏的颜色: (1).在项目 Info plist 里面添加:View controller-based status bar appearance 设置为 NO (2).在项目的BaseViewController 里面添加方法: // 设置状态栏 颜色为白色 if (iOS7Later) { // 判断是否是IOS7 [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent a

iOS中NSString常用操作合集

//1.创建常量字符串. NSString *astring = @"This is a String!"; //2.创建空字符串,给予赋值. NSString *astring = [[NSString alloc] init]; astring = @"This is a String!"; [astring release]; NSLog(@"astring:%@",astring); // NSString *astring = [[NS

iOS 中UISlider常用知识点

self.slider=[[UISlider alloc]initWithFrame:CGRectMake(50, 100, 200, 50)]; //self.slider.tintColor=[UIColor blueColor];//已经使用进度条颜色        //数值减小(球左边)颜色    self.slider.minimumTrackTintColor=[UIColor greenColor];//已使用进度条颜色    //数值增大(球右边)颜色    self.slide

iOS中UISegmentedControl常用属性

NSArray *[email protected][@"红",@"黄",@"蓝"];    //数组中有多少元素,分段控制就有多少条目(分段)    self.seg=[[UISegmentedControl alloc] initWithItems:array];    //选中某一个    self.seg.selectedSegmentIndex=0;    self.seg.tintColor=[UIColor redColor];//

iOS中RGB常用的色值,同时可将对颜色的设置定义成宏,方便开发应用

如: // RGB颜色转换(16进制->10进制) #define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0] // 获取

iOS中RGB颜色转换

iOS中RGB常用的色值,同时可将对颜色的设置定义成宏,方便开发应用,如: // RGB颜色转换(16进制->10进制) #define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue