初识socket编程---教你正确分手哦!!!
初识socket编程---教你正确分手哦!!!
- 先礼后兵,理解三次握手,四次挥手才能在socket有的放矢
- 先康康一些补充
- 补充:TCP的头部结构
- 走进科学
- 三次握手
- 写成故事,方便你理解
- 四次挥手
- 写成故事,方便你理解
- 故事启发
- socket编程的实现
- 模仿三握四挥的socket编程流程图
- 编写server.c文件
- 编写client.c文件
- 分别编译然后在两个窗口调用两个文件
- 进行编译,然后调用server.c
- 点击file---new window创建新窗口
- 在新窗口调用client.c得到server端的信息:hello world!
- 展望未来
- 之后会挑战搭建基于socket的聊天室,一起努力呀!冲冲冲!!!
先礼后兵,理解三次握手,四次挥手才能在socket有的放矢
先康康一些补充
补充:TCP的头部结构
走进科学
三次握手
1.第一次握手:Client将标志位SYN置1,随机产生一个seq=X,并将该数据包发送给Server,Client进入STN_SENT状态,等待Server确认。
2.第二次握手:Server收到数据包后由标志位SYN=1指导Client请求建立链接,Server将标志位SYN和ACK都置为1,ack=X+1,随机产生一个seq=Y,并将该数据包发送给Client以确认链接请求,Server进入SYN_RCVD状态
3.第三次握手:Client收到确认后,if(ack等于X+1&&ACK等于1) 则将ACK置1,ack=Y+1,并将该数据包发送给Server,Server检查ack是否等于Y+1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间就可以开始传输数据了。
写成故事,方便你理解
握手次数 | 故事写成诗 |
---|---|
第一次 | 麦林炮手:一起双飞吗??? |
第二次 | 蛮族之王: 好的,我早已饥渴难耐 |
第三次 | 麦林炮手:10秒后起飞哦,要抓紧我! |
四次挥手
所谓四次挥手,即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。在socket编程中,这一过程由客户端或服务端任一方执行close来触发。
由于TCP连接时全双工的,因此,每个方向都必须要单独进行关闭,这一原则是当以放完成数据发送任务后,发送一个FIN来终止这一放方向的连接,收到一个FIN只是意味着这一方向上没有数据流动了,即不会再收到数据了,但是再这个TCP连接上仍然能够发送数据,直到这一方向也发送了FIN。首先进行关闭的一方将执行主动关闭,而另一方则执行被动关闭。
1.第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态
2.第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态
3.第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态
4.第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSERD状态,完成四次挥手。
写成故事,方便你理解
挥手次数 | 故事写成诗 |
---|---|
第一次 | 女:感情淡了,分手吧! |
第二次 | 男:你冷静一点,我想想我哪里错了 |
第三次 | 男:我没错啊,就是感情谈了,分手吧! |
第四次 | 女:嘿嘿,我就是找茬分手!分手成功 |
故事启发
握手就不说了,说说分手!
第二次挥手,分析出问题,无法分手
第三次挥手,第二次没分析出,但还想挽留,无法分手
第四次挥手,女方醒悟,无法分手
分手还挺难的,建议不到万不得已不要分手。
看到这里就快关注我吧!
socket编程的实现
模仿三握四挥的socket编程流程图
编写server.c文件
创建一个server.c文件然后编写程序如下
vim server.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(){//创建套接字int serv_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//将套接字和IP、端口绑定struct sockaddr_in serv_addr;memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充serv_addr.sin_family = AF_INET; //使用IPv4地址serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具体的IP地址serv_addr.sin_port = htons(1234); //端口bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));//进入监听状态,等待用户发起请求listen(serv_sock, 20);//接收客户端请求struct sockaddr_in clnt_addr;socklen_t clnt_addr_size = sizeof(clnt_addr);int clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size);//向客户端发送数据char str[] = "Hello World!";write(clnt_sock, str, sizeof(str));//关闭套接字close(clnt_sock);close(serv_sock);return 0;
}
编写client.c文件
创建一个client.c文件然后编写程序如下
vim client.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main(){//创建套接字int sock = socket(AF_INET, SOCK_STREAM, 0);//向服务器(特定的IP和端口)发起请求struct sockaddr_in serv_addr;memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充serv_addr.sin_family = AF_INET; //使用IPv4地址serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具体的IP地址serv_addr.sin_port = htons(1234); //端口connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr));//读取服务器传回的数据char buffer[40];read(sock, buffer, sizeof(buffer)-1);printf("Message form server: %s\n", buffer);//关闭套接字close(sock);return 0;
}
分别编译然后在两个窗口调用两个文件
进行编译,然后调用server.c
gcc server.c -o server
gcc client.c -o client
./server
点击file—new window创建新窗口
在新窗口调用client.c得到server端的信息:hello world!
./client
展望未来
之后会挑战搭建基于socket的聊天室,一起努力呀!冲冲冲!!!
初识socket编程---教你正确分手哦!!!相关推荐
- 初识网络及socket编程基础
理解源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址. 源ip地址就是发送端ip,目的ip地址就是接收端ip 思考: 我们光有IP地址就可以完成通 ...
- Python 中最全面的 Socket 编程指南
(点击上方公众号,可快速关注一起学Python) 翻译: keelii 链接: https://keelii.com/2018/09/24/socket-programming-in-pytho ...
- 华中科技大学计算机通信与网络实验,华中科技大学计算机通信与网络实验报告Socket编程实验.docx...
实验一 Socket编程实验 1.1环境 开发环境:Windows 10 64 位,Intel Core i5-7300HQ CPU, 8GB 内存 1.1. 1开发平台 Microsoft Visu ...
- IP地址的三种表示格式及在Socket编程中的应用
转自:http://blog.csdn.net/hguisu/article/details/7449955 使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理.IP地址其 ...
- python基础之socket编程
阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 ...
- 转Go语言TCP Socket编程
授权转载: Tony Bai 原文连接: https://tonybai.com/2015/11/17/tcp-programming-in-golang/ Golang的主要 设计目标之一就是面向大 ...
- Android socket 编程 实现消息推送(二)
上篇文章Android socket 编程 实现消息推送(一)讲到socket编程的消息推送原理,现在我们来看看基于Android客户机socket编程实现消息推送的过程. 根据消息推送的原理图,我们 ...
- Java从零开始学四十五(Socket编程基础)
一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...
- golang TCP Socket编程
Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分.在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均 ...
最新文章
- 4.AngularJS四大特征之二: 双向数据绑定
- Go worker并发模式
- C++11之std::async使用介绍
- 重构——解决过长参数列表(long parameter list)
- ECMAScript 的发展历史
- Xcode7 出现-fembed-bitcode错误的解决办法
- Ubuntu下一个好用的MySQL客户端tora
- 没有可用软件包 docker-compose。_R语言CRAN软件包Meta分析
- 3376: [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)
- POJ 2752 Seek the Name, Seek the Fame (KMP)
- 灰色预测模型matlab预测20个数据,怎么matlab灰色模型预测这组数据的下一...
- C# WPF做的漂亮的登陆界面[附源码]
- 孙式太极拳的站桩(作者:孙剑云)
- Python的列表解析式,集合解析式,字典解析式
- 10 大最佳网络分析工具介绍
- Tensorflow学习-自定义模型
- adb shell dumpsys appops
- Windows7 键盘快捷
- 带负荷测试要求二次最小电流_带负荷测试的判别
- 【天光学术】药学论文:医院药学部门管理现状与对策(节选)
热门文章
- nodejs中.use()的用法(坑)
- 仿百度动态Android源码,Android 仿百度手机助手首页滑动效果
- 企业电子邮箱官网,企业电子邮箱地址大全
- 毕设springBoot+vue 中药店商城系统(含源码+论文)
- 4.1.4 规划、设计的艺术(技术)流派和常用技法(上)
- 150款+炫酷的CSS3 loading加载动画,总有一款适合你
- QQ三国 秘制机簧去哪打?打的太慢?
- html一个圆圈加一个感叹号,圆圈里面一个感叹号是什么标志
- css-background属性连写
- 关于彩虹字体和渐变字体