iOS网络编程笔记——Socket底层实现笔记
Socket简单底层实现笔记:
以Socket客户端编程为例:
1.导入头文件
#import <arpa/inet.h> #import <netinet/in.h> #import <sys/socket.h>
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写的非常好,大家一起学习。