Socket简单底层实现笔记:
以Socket客户端编程为例:
1.导入头文件
#import#import #import
2.创建Socket
@implementation ViewController {int _clientSocket;}/*1.AF_INET: ipv4 执行ip协议的版本2.SOCK_STREAM:指定Socket类型,面向连接的流式socket 传输层的协议3.IPPROTO_TCP:指定协议。 IPPROTO_TCP 传输方式TCP传输协议返回值 大于0 创建成功*/_clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
3.建立链接与服务器
/*终端里面 命令模拟服务器 netcat nc -lk 12345参数一:套接字描述符参数二:指向数据结构sockaddr的指针,其中包括目的端口和IP地址参数三:参数二sockaddr的长度,可以通过sizeof(struct sockaddr)获得返回值 int -1失败 0 成功*/struct sockaddr_in addr;/* 填写sockaddr_in结构*/addr.sin_family = AF_INET;addr.sin_port=htons(12345);addr.sin_addr.s_addr = inet_addr("127.0.0.1");int connectResult= connect( _clientSocket, (const struct sockaddr *)&addr, sizeof(addr));
4.发送数据
/*第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程式要发送数据的缓冲区;第三个参数指明实际要发送的数据的字符数;第四个参数一般置0。成功则返回实际传送出去的字符数,失败返回-1,*/char * str = "itcast";ssize_t sendLen = send( _clientSocket, str, strlen(str), 0);
5.从服务器接收数据
/*第一个参数socket第二个参数存放数据的缓冲区第三个参数缓冲区长度。第四个参数指定调用方式,一般置0返回值 接收成功的字符数*/char *buf[1024];ssize_t recvLen = recv( _clientSocket, buf, sizeof(buf), 0);NSLog(@"---->%ld",recvLen);
6.关闭连接
close( _clientSocket);
简书上帖子的封装方法:
//发送数据并等待返回数据- (void)sentAndRecv:(NSString *)msg { dispatch_queue_t q_con = dispatch_queue_create("CONCURRENT", DISPATCH_QUEUE_CONCURRENT); dispatch_async(q_con, ^{ const char *str = msg.UTF8String; ssize_t sendLen = send(_clientSocket, str, strlen(str), 0); char *buf[1024]; ssize_t recvLen = recv(_clientSocket, buf, sizeof(buf), 0); NSString *recvStr = [[NSString alloc] initWithBytes:buf length:recvLen encoding:NSUTF8StringEncoding]; dispatch_async(dispatch_get_main_queue(), ^{ self.tv_showMSG.text = recvStr; }); }); }//建立连接- (void)connectToServer:(NSString *)ip port:(int)port { _clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); struct sockaddr_in addr; /* 填写sockaddr_in结构*/ addr.sin_family = AF_INET; addr.sin_port = htons(port); addr.sin_addr.s_addr = inet_addr(ip.UTF8String); int connectResult = connect(_clientSocket, (const struct sockaddr *)&addr, sizeof(addr)); if (connectResult == 0) { NSLog(@"conn ok"); _status.text = @"连接成功"; }else{ _status.text = @"连接失败"; }}
原帖:http://www.jianshu.com/p/1883977690b3写的非常好,大家一起学习。