两年后的今天,再读iOS Socket有感

序言:

这两年兜兜转转,曾几度要放弃iOS行业,转行Python,但还是一直坚持下来了。编程语言只是一个工具,我并不是要指定自己就是iOS工程师。没有放弃iOS,是因为通过iOS我才更喜欢编程的,所以做一个🇨🇳China Boy要勿忘初心!

懂的越多,越觉得自己很渺小

    看了以前自己写的简历,内容有如精通xx、熟悉xx等等,看了实在吓一跳,每个编程语言都是无数前辈智慧的结晶,我一个渺小的沙子竟然敢说精通沙漠的构造!!!惭愧,人总要反思反思,两年后的今天,我还是像刚入门一样,初级工程师头衔未变,变的是增多了几道细细眼纹。
    两年,一个人在进化,过程虽慢,但细细回顾,收获还是有。
    两年,收到无数封面试不通过的邮件,收到无数封因为学历问题无法去面试的邮件,收到无数个面试官冷言嘲讽,这些因素都在激励着我写技术总结文章,或简书或在印象笔记里总结。


(题外话,收一下。)


再读iOS Socket有感

下面我会用浅显的语言来描述IP地址、端口、三次握手、四次握手等:
一、ip地址就是网络设备标示,比如我的iMac的ip地址是192.168.0.6,那么我们就是通过ip地址来找到我的设备。
二、端口说白了就是我电脑里的进程,好比如我通过8866端口找到了印象笔记
三、再说下三次握手,以图为准



客户端发送消息给服务器->服务器确定后返回Ack->此时,客户端发送准备就绪消息。
四、四次握手


  1. TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送
  2. 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
  3. 服务器关闭客户端的连接,发送一个FIN给客户端。
  4. 客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

上面采用非常浅显的语言来描述,是为了叙说Socket做铺垫
Socket(套接字层、插座)开始是纯C语言,我们所说的网络通信就是Socket间的通信,Socket封装TCP,通信的两端都是Socket。


新建一个Demo做实验

在ViewController.m文件里,导入socket所需要的库

#import <sys/socket.h>
#import <netinet/in.h>
#import <arpa/inet.h>

1.创建一个socket,设置端口和ip地址,连接服务器

    // 1.创建一个socket
    /*
     domain: 协议域 IPV4 ,IPV6
     type: socket 类型  SOCKET_STREAM(TCP) / SOCK_DGRAM(UDP)
     protocol: TCP ? UDP ? 0 ,自动根据第二个参数来决定合适的协议
     */
     int cr_Socket =  socket(AF_INET, SOCK_STREAM, 0);
    
    // 2.连接服务器
    struct sockaddr_in  cr_sever_Addr;
    cr_sever_Addr.sin_family = AF_INET;
    
    // 端口
    cr_sever_Addr.sin_port = htons(8866);
    
    // ip地址
    cr_sever_Addr.sin_addr.s_addr = inet_addr("127.0.0.1");

判断是否连接成功

    /*
     参数1:客户端的socket
     参数2:指向数据结构sockaddr_in 的指针,其中包括端口、IP地址
     参数3:结构体数据的长度
     */
   int connectedResult =  connect(cr_Socket, (const struct sockaddr * )&cr_sever_Addr, sizeof(cr_sever_Addr));
    if (connectedResult  == 0) {
        NSLog(@"连接成功!");
    } else {
        NSLog(@"连接失败:%d",connectedResult);
    }

3.发送数据给服务器

    // 3.发送数据给服务器
    
    /*
     参数1:客户端的socket
     参数2:发送内容的地址
     参数3:发送内容的长度
     参数4:发送方式的标志,一般都0
     */
    NSString *sendMsg = @"Hello CR!";
    
    ssize_t sendLen =  send(cr_Socket, sendMsg.UTF8String, strlen(sendMsg.UTF8String), 0);
    
    NSLog(@"发送内容是:%@, 共%ld字符",sendMsg, sendLen);

4.从服务器去接收数据

    // 4.从服务器去接收数据
    uint8_t buffer[1024];
    /*
     参数1:客户端的socket
     参数2:接收内容的缓存区地址
     参数3:接收内容的长度
     参数4:接收的方式,0,表示阻塞,必须等待服务器返回数据
     
    返回值:成功:读入的字节数据
           失败:
     */
    ssize_t recvLen =  recv(cr_Socket, buffer, sizeof(buffer), 0);
    NSLog(@"接收了%ld字节数据",recvLen);

5.关闭socket连接,关闭后无法接收消息

    // 5.关闭socket连接
    /*
     一旦关闭就无法接收了!
     */
   //  close(cr_Socket);

在本地测试实验效果,开启终端输入命令~$ nc -lk 8866,回车
nc 是Netcat的简称,可百度Netcat,知道它是终端下用于调试和检查网络的工具包

运行我们上面所创建的项目

终端的输出



然后在旁边敲个abc,回车
客户端显示:


实验效果成功,这里根据自身情况可了解TCP流控和拥塞控制。

一、TCP流控(Flow control):
    是站在单条 TCP 连接的维度,目的是让发送方发包的速度,不超过接收方收包的能力,所以 flow control 解决的问题是,如何在接收方可承受的范围内,让单条 TCP 连接的速度最大化。

二、拥塞控制(Congestion control):
    则是站在整个互联网的维度,让网络里所有 TCP 连接最大化共享网络通道的同时,尽可能的少出现网络拥塞现象,让网络世界里的每一个参与者既公平又高效。

详细资料可参考MrPeak,讲的很好:
TCP/IP 系列之 TCP 流控与拥塞控制(一) by MrPeak杂货铺

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容