B19-socket初窥(上)
本文章内容总结自网络视频,感谢🙏
学前知识
一、网路通讯三要素
1、IP地址(主机名)
1》网络中设备的标示
2》不易记忆,可以用主机名
3》本地回环地址:127.0.0.1 主机名:localhost
2、端口号
1》用于标示进程的逻辑地址,不同进程的标示
2》有效端口:0~65535
3》其中0~1024由系统使用或者保留端口,开发中不要使用1024以下的端口
3、传输协议(通讯的规则)
1》TCP
2》UDP
ps:www.ip138.com网站可以用来查询IP信心。
二、常见网络协议
三、网络七层协议
传递信息时,由上到下再由下到上分别是封包和解包。
四、TCP和UDP
1、UDP(用户数据报协议)
1》只管发送,不确认对方是否接收到
2》将数据及源和目的封装成数据包中,不需要建立连接
3》每个数据报的大小限制在64K之内
4》因为无需连接,因此是不可靠协议
5》不需要建立连接,速度快
6》应用场景:多媒体教室/网络流媒体,用得很少
2、TCP(传输控制协议)
1》建立连接,形成传输数据的通道
2》在连接中进行大数据传输(数据大小不收限制)
3》通过三次握手完成连接,是可靠协议,安全送达
4》必须建立连接,效率会稍低
五、建立连接的三次握手,断开连接的四次握手
正文
一、Socket(插座)概念
1、Socket就是为网络服务提供的一种机制
1》在Unix中,网络既是Socket,并不局限在TCP/UDP
2》Socket可以用于自定义协议
2、通信的两端都是Socket
3、网络通信其实就是Socket间的通信
4、数据在两个Socket间通过IO传输
5、Socket开始时是纯C语言的,是跨平台的
二、Socket通讯示意图
三、利用终端nc建立socket聊天
1 // 1. 创建 socket 2 /** 3 参数 4 5 domain: 协议域,AF_INET->IPV4 6 type: Socket 类型,SOCK_STREAM(TCP)/SOCK_DGRAM(报文 UDP) 7 protocol: IPPROTO_TCP,如果传入0,会自动根据第个参数,选择合适的协议 8 9 返回值 10 socket > 0 就成功 11 */ 12 int clientSocket = socket(AF_INET, SOCK_STREAM, 0); 13 14 // 2. 连接到服务器 15 /** 16 参数 17 1> 客户端socket 18 2> 服务器地址结构体指针 19 3> 结构体数据长度 20 返回值 21 0 成功/其他 错误代号 22 */ 23 struct sockaddr_in serverAddr; 24 serverAddr.sin_family = AF_INET; 25 // 端口 26 serverAddr.sin_port = htons(12345); // 终端输入 $nc -lk 12345才能连接成功(打开本机12345端口,并持续监听) 27 // 地址 inet_addr 函数,可以将 ip 地址转换成一个数字 28 serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); 29 // 在 C 语言开发中,经常传递一个数据结构的指针同时,需要指定该数据结构的长度 30 int connResult = connect(clientSocket, (const struct sockaddr *)&serverAddr, sizeof(serverAddr)); 31 if (connResult == 0) { 32 NSLog(@"连接成功"); 33 } else { 34 NSLog(@"连接失败-%d",connResult); 35 } 36 37 // 3. 发送数据给服务器 38 /** 39 参数 40 1> 客户端socket 41 2> 发送内容地址 42 3> 发送内容长度 43 4> 发送方式标志,一般为0 44 返回值 45 如果成功,则返回发送的字节数,失败则返回SOCKET_ERROR 46 */ 47 NSString *sendMsg = @"are you ok?"; 48 ssize_t sendLength = send(clientSocket, sendMsg.UTF8String, strlen(sendMsg.UTF8String), 0); 49 NSLog(@"发送了%ld个字节",sendLength); 50 51 // 4. 从服务器接收数据 52 /** 53 参数 54 1> socket 55 2> 接收数据的缓冲区地址,需要提前准备 56 3> 缓冲区长度 57 4> 标记,0,阻塞式 58 59 返回值 60 如果成功,则返回接收到的字节数 61 */ 62 uint8_t buffer[1024]; // 要把空间准备出来 63 ssize_t recvLength = recv(clientSocket, buffer, sizeof(buffer), 0); 64 NSLog(@"接收了%ld个字节",recvLength); 65 // 获取服务器返回的数据,从缓冲区中读取 recvLen 个字节! 66 NSData *data = [NSData dataWithBytes:buffer length:recvLength]; 67 // 转换成字符串 68 NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 69 NSLog(@"%@",str); 70 71 // 5、关闭 72 /** 73 长连接:连上就一直聊!通常用于 QQ,即时通讯,效率高! 74 短连接:通讯一次,马上断开,下一次再次建立连接,效率低 75 */ 76 close(clientSocket);
1、Netcat
1》是一个终端下用于调试和检查网络的工具包
2》可用于创建 TCP/IP 连接
2、智能家居原理
1》手机端只是发送指令和接收回执解析。核心控制模块都在硬件里集成,无法扩展或改变。
四、socket的HTTP访问的实现
1、HTTP访问本地
1》打开本地apache服务器
$ sudo apachectl -k start
2》用socket访问127.0.0.1:80,发送一句话,不会接收到回复信息
3》在火狐浏览器输入localhost会返回It works!
4》复制火狐浏览器访问localhost时的请求源给socket,socket再次访问127.0.0.1:80,会返回It works!。(请求头信息可以简化)
2、HTTP访问本地,返回自定义文件
1》创建文件
$ more /etc/apache2/httpd.conf
$ /DocumentRoot // 拿到目录
$ cd //Library/WebServer/Documents // (pwd ls 确认一下)
$ sudo vim demo.txt // 创建后添加数据
2》更改请求字符串的请求行
NSString *request = @"GET /abc.txt HTTP/1.1\n"
3》重新请求就会接收到自定义文件内容。
3、HTTP访问百度
1》获取百度IP地址
$ ping www.baidu.com
2》访问IP改为百度IP
访问会返回一个cookie
3》由于百度的安全机制,需要拿到的cookie进行拼接,再次请求才会返回实体信息。
ps:HTTP协议规定的请求和响应的结构分析
1》请求包括:
a、请求行:(请求方法、请求资源路径、HTTP协议版本)
b、请求头:(对客户端的环境描述、客户端请求的主机地址等信息)
c、请求体:(发给服务器的具体数据)
2》响应
a、状态行:(HTTP协议版本、状态码、状态英文名称)
b、响应头:(对服务器的描述、对返回数据的描述)
c、实体内容:(服务器返回给客户端的具体数据)