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();
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), );

5.从服务器接收数据

/*
第一个参数socket
第二个参数存放数据的缓冲区
第三个参数缓冲区长度。
第四个参数指定调用方式,一般置0
返回值 接收成功的字符数
*/
char *buf[];
ssize_t recvLen = recv( _clientSocket, buf, sizeof(buf), );
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), );
char *buf[];
ssize_t recvLen = recv(_clientSocket, buf, sizeof(buf), );
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 == ) {
NSLog(@"conn ok");
_status.text = @"连接成功";
}else{ _status.text = @"连接失败"; }
}

原帖:http://www.jianshu.com/p/1883977690b3写的非常好,大家一起学习。

iOS网络编程笔记——Socket底层实现笔记的更多相关文章

  1. iOS 网络编程:socket

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  2. 【IOS网络编程】socket编程 - Asyncsocket

    Phone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它来简化CFNetwork的调用,它提供了异步操作 主要特性有: 队列的非阻塞的读和写,而 ...

  3. iOS网络编程笔记——Socket编程

    一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...

  4. iOS网络编程模型

    iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...

  5. Linux高并发网络编程开发——10-Linux系统编程-第10天(网络编程基础-socket)

    在学习Linux高并发网络编程开发总结了笔记,并分享出来.有问题请及时联系博主:Alliswell_WP,转载请注明出处. 10-Linux系统编程-第10天(网络编程基础-socket) 在学习Li ...

  6. java基础-网络编程(Socket)技术选型入门之NIO技术

    java基础-网络编程(Socket)技术选型入门之NIO技术 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.传统的网络编程 1>.编写socket通信的MyServer ...

  7. [深入浅出Cocoa]iOS网络编程之Socket

    http://blog.csdn.net/kesalin/article/details/8798039 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   [深入浅出Co ...

  8. IOS网络编程——第三方类库

    IOS网络编程——第三方类库 目录 概述 ASIHttpRequest AFNetworking 其他 概述 ASIHttpRequest AFNetworking 其他

  9. IOS网络编程:HTTP

    IOS网络编程:HTTP HTTP定义了一种在服务器和客户端之间传递数据的途径. URL定义了一种唯一标示资源在网络中位置的途径. REQUESTS 和 RESPONSES: 客户端先建立一个TCP连 ...

随机推荐

  1. 棒!使用.NET Core构建3D游戏引擎

    原文地址:https://mellinoe.wordpress.com/2017/01/18/net-core-game-engine/ 作者:ERIC MELLINO 翻译:杨晓东(Savorboa ...

  2. 创建 vxlan 并部署 instance - 每天5分钟玩转 OpenStack(147)

    上一节我们完成了 OVS VxLAN 的配置工作,今天创建 vxlan100_net 并部署 instance. 创建 vxlan100_net 打开菜单 Admin -> Networks,点 ...

  3. ArcGIS制图技巧系列(3)—让地图更有立体感

    ArcGIS制图技巧系列(3)-让地图更有立体感 by 李远祥 在前面的章节中,我们已经介绍过各种的地图效果,如发光效果,山体阴影效果,植被填充效果等,所有的这些效果不外乎是各种技术的叠加和技巧的使用 ...

  4. 二叉搜索树Java实现(查找、插入、删除、遍历)

    由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出- ...

  5. this的相关介绍与用法

    当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this.因此,this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this,并 ...

  6. 64位win2003 IIS6运行32位的.NET程序

    做web服务迁移,从32位win2003迁移到64位win2003,数据库是32位Oracle在另外一台服务器上. 迁移之后数据库各种连不上,oracle的客户端32位的装完装64位的,odp.net ...

  7. 使用fliter实现ie下css中rgba的效果

    直接举例吧background-color: rgba(255,255,255,0.8); 设置背景颜色为白色,不透明度设为80% 在ie下可以用fliter这一属性进行设置: filter:prog ...

  8. JavaWeb验证码的使用

    在Java Web开发中,我们经常需要使用到验证码功能,一般情况下,我们可以将产生的验证码保存到服务器端中的session中,这种方式中,是使用服务器来保证验证码的功能.另外,我们也可以采用js产生验 ...

  9. 20130620—ant和java杂学随笔

    ant知识点: 1.使用属性定义相对路径的时候,一定要使用location,而不要去使用value  对于<property></property>中location和valu ...

  10. [原创.数据可视化系列之十三]idw反距离权重插值算法的javascript代码实现

    图形渲染中,idw反距离权重插值算法是一个应用非常广泛的方法,但是js实现的比较少,目前实现一个: //idw算法 //输入[[x:0,y:0,v:0],[x:0,y:0,v:0],[x:0,y:0, ...