初识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编程---教你正确分手哦!!!相关推荐

  1. 初识网络及socket编程基础

    理解源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址. 源ip地址就是发送端ip,目的ip地址就是接收端ip 思考: 我们光有IP地址就可以完成通 ...

  2. Python 中最全面的 Socket 编程指南

    (点击上方公众号,可快速关注一起学Python) 翻译:  keelii   链接: https://keelii.com/2018/09/24/socket-programming-in-pytho ...

  3. 华中科技大学计算机通信与网络实验,华中科技大学计算机通信与网络实验报告Socket编程实验.docx...

    实验一 Socket编程实验 1.1环境 开发环境:Windows 10 64 位,Intel Core i5-7300HQ CPU, 8GB 内存 1.1. 1开发平台 Microsoft Visu ...

  4. IP地址的三种表示格式及在Socket编程中的应用

    转自:http://blog.csdn.net/hguisu/article/details/7449955 使用TCP/IP协议进行网络应用开发的朋友首先要面对的就是对IP地址信息的处理.IP地址其 ...

  5. python基础之socket编程

    阅读目录 一 客户端/服务器架构 二 osi七层 三 socket层 四 socket是什么 五 套接字发展史及分类 六 套接字工作流程 七 基于TCP的套接字 八 基于UDP的套接字 九 粘包现象 ...

  6. 转Go语言TCP Socket编程

    授权转载: Tony Bai 原文连接: https://tonybai.com/2015/11/17/tcp-programming-in-golang/ Golang的主要 设计目标之一就是面向大 ...

  7. Android socket 编程 实现消息推送(二)

    上篇文章Android socket 编程 实现消息推送(一)讲到socket编程的消息推送原理,现在我们来看看基于Android客户机socket编程实现消息推送的过程. 根据消息推送的原理图,我们 ...

  8. Java从零开始学四十五(Socket编程基础)

    一.网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输. 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可 ...

  9. golang TCP Socket编程

    Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分.在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均 ...

最新文章

  1. 4.AngularJS四大特征之二: 双向数据绑定
  2. Go worker并发模式
  3. C++11之std::async使用介绍
  4. 重构——解决过长参数列表(long parameter list)
  5. ECMAScript 的发展历史
  6. Xcode7 出现-fembed-bitcode错误的解决办法
  7. Ubuntu下一个好用的MySQL客户端tora
  8. 没有可用软件包 docker-compose。_R语言CRAN软件包Meta分析
  9. 3376: [Usaco2004 Open]Cube Stacking 方块游戏(带权并查集)
  10. POJ 2752 Seek the Name, Seek the Fame (KMP)
  11. 灰色预测模型matlab预测20个数据,怎么matlab灰色模型预测这组数据的下一...
  12. C# WPF做的漂亮的登陆界面[附源码]
  13. 孙式太极拳的站桩(作者:孙剑云)
  14. Python的列表解析式,集合解析式,字典解析式
  15. 10 大最佳网络分析工具介绍
  16. Tensorflow学习-自定义模型
  17. adb shell dumpsys appops
  18. Windows7 键盘快捷
  19. 带负荷测试要求二次最小电流_带负荷测试的判别
  20. 【天光学术】药学论文:医院药学部门管理现状与对策(节选)

热门文章

  1. nodejs中.use()的用法(坑)
  2. 仿百度动态Android源码,Android 仿百度手机助手首页滑动效果
  3. 企业电子邮箱官网,企业电子邮箱地址大全
  4. 毕设springBoot+vue 中药店商城系统(含源码+论文)
  5. 4.1.4 规划、设计的艺术(技术)流派和常用技法(上)
  6. 150款+炫酷的CSS3 loading加载动画,总有一款适合你
  7. QQ三国 秘制机簧去哪打?打的太慢?
  8. html一个圆圈加一个感叹号,圆圈里面一个感叹号是什么标志
  9. css-background属性连写
  10. 关于彩虹字体和渐变字体