博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS网络编程笔记——Socket底层实现笔记
阅读量:6567 次
发布时间:2019-06-24

本文共 2388 字,大约阅读时间需要 7 分钟。

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写的非常好,大家一起学习。

转载于:https://www.cnblogs.com/byxixiblogs/p/6542972.html

你可能感兴趣的文章
select 下拉菜单Option对象使用add(elements,index)方法动态添加
查看>>
tomcat及负载均衡
查看>>
Linux磁盘管理(实验)
查看>>
【XXX贷】2014年10月XX日发标预告
查看>>
DevExpress v15.1:WPF控件升级(四)
查看>>
掌握ConstraintLayout(十)按比例设置视图大小
查看>>
第10课--10_04_LVM之二
查看>>
搭建lnmp环境
查看>>
JavaScript改变 HTML 内容
查看>>
IPv6过渡技术
查看>>
内核调度进程的机制
查看>>
python-68:BS4获取多个标签的文本
查看>>
Web系统大规模并发——电商秒杀与抢购
查看>>
springMvc时间格式化
查看>>
JS重复引用也会导致错误
查看>>
springMVC整合shiro权限框架示例与实践
查看>>
npm安装bower时报错 我已解决
查看>>
c#中ref与out的区别
查看>>
find命令使用
查看>>
spring集成rabbitmq遇到的问题
查看>>