一.什么是Socket?

1.Socket是一个网络通信的套接字(接口)

二.Socket的实现流程?

1.Socket在客户端和服务端发生了什么?

服务器:a.socket()创建socket对象b.bind()为socket对象绑定协议,赋予名字c.listen()监听此socket,将socket从默认主动类型改为被动类型客户端:a.socket()创建一个socket对象b.connect()连接服务器的socket对象

2.连接过程(TCP):

三次握手连接

3.通信过程:

服务器,客户端都可使用read(),write()等函数

4.释放过程(TCP):

四次握手释放

三.Socket通信基本步骤

根据socket通信基本流程图,总结通信的基本步骤:
服务器端:
第一步:创建一个用于监听连接的Socket对像;
第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;
第三步:用socket对像的Bind()方法绑定EndPoint;
第四步:用socket对像的Listen()方法开始监听;
第五步:接收到客户端的连接,用socket对像的Accept()方法创建一个新的用于和客户端进行通信的socket对像;
第六步:通信结束后一定记得关闭socket;
客户端:
第一步:建立一个Socket对像;
第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;
第三步:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;
第四步:如果连接成功,就用socket对像的Send()方法向服务器发送信息;
第五步:用socket对像的Receive()方法接受服务器发来的信息 ;
第六步:通信结束后一定记得关闭socket;

服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

四.Socket中TCP的三次握手建立连接详解

我们知道TCP建立连接要进行“三次握手”,即交换三个分组。大致流程如下:

  • 客户端向服务器发送一个SYN J
  • 服务器向客户端响应一个SYN K,并对SYN J进行确认ACK J+1
  • 客户端再想服务器发一个确认ACK K+1

只有就完了三次握手,但是这个三次握手发生在socket的那几个函数中呢?请看下图:

http://images.cnblogs.com/cnblogs_com/skynet/201012/201012122157467258.png

socket中发送的TCP三次握手

从图中可以看出,当客户端调用connect时,触发了连接请求,向服务器发送了SYN J包,这时connect进入阻塞状态;服务器监听到连接请求,即收到SYN J包,调用accept函数接收请求向客户端发送SYN K ,ACK J+1,这时accept进入阻塞状态;客户端收到服务器的SYN K ,ACK J+1之后,这时connect返回,并对SYN K进行确认;服务器收到ACK K+1时,accept返回,至此三次握手完毕,连接建立。

总结:客户端的connect在三次握手的第二次返回,而服务器端的accept在三次握手的第三次返回。

五.Socket中TCP的四次握手释放连接详解

上面介绍了socket中TCP的三次握手建立过程,及其涉及的socket函数。现在我们介绍socket中的四次握手释放连接的过程,请看下图:

http://images.cnblogs.com/cnblogs_com/skynet/201012/201012122157487616.png

socket中发送的TCP四次握手

图示过程如下:

  • 某个应用进程首先调用close主动关闭连接,这时TCP发送一个FIN M;
  • 另一端接收到FIN M之后,执行被动关闭,对这个FIN进行确认。它的接收也作为文件结束符传递给应用进程,因为FIN的接收意味着应用进程在相应的连接上再也接收不到数据;
  • 一段时间之后,接收到文件结束符的应用进程调用close关闭它的socket。这导致它的TCP也发送一个FIN N;
  • 接收到这个FIN的源发送端TCP对它进行确认。
  • 这样每个方向上都有一个FIN和ACK。

socket不能bind请求的地址_socket通信原理相关推荐

  1. socket不能bind请求的地址_深入浅出讲解:php的socket通信

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 什么是TCP/IP.UDP? Socket在哪里呢? Socket是什么呢? 你 ...

  2. winform UDP socket 10049错误 “在其上下文中,该请求的地址无效”。解决方案。

    winform UDP socket,无法绑定 IP端口,10049错误,"在其上下文中,该请求的地址无效".解决方案. 1.关闭防火墙 2.插上网线连接(仪器) 3.(重要)将本 ...

  3. 【Python之旅】第五篇(一):Python Socket通信原理

    1.Socket socket也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求.可以列举中 ...

  4. Socket通信原理探讨(C++为例)

    一.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 1.消息传递(管道.FIFO.消息队列) 2.同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 3 ...

  5. Socket通信原理

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP? 2.         Soc ...

  6. php winform通信,C# Winform 通过Socket实现客户端和服务端TCP通信

    操作界面如下: 1.声明Socket 第一个参数:寻址方式,第二个参数:传输数据的方式,第三个参数:通信协议 Socket socket = new Socket(AddressFamily.Inte ...

  7. 【Linux网络编程学习】socket API(socket、bind、listen、accept、connect)及简单应用

    此为牛客Linux C++课程和黑马Linux系统编程笔记. 1. 什么是socket 所谓 socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象. 一个套接字就是网络 ...

  8. 安卓Socket与pc端c#服务器的通信 附完整代码

    一.前言 小生不才,学习安卓socke通信打了很多滚,遇到过很多问题,也翻过前辈们关于socket的讲解,很杂各有见解,案例也不是很完整,于是特地将此安卓Socket与pc端c#服务器的通信代码讲解与 ...

  9. QT中使用C++ socket通信,socket通信原理三次握手和四次握手详解、客户端与服务端实例详解

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1.         什么是TCP/IP.UDP? 2.         Soc ...

最新文章

  1. 关于美工ps出图table格式的处理
  2. Iterator迭代器
  3. 开发办公APP时间估算
  4. Zookeeper核心工作机制(zookeeper特性、zookeeper数据结构、节点类型)
  5. leetcode 303. Range Sum Query - Immutable | 303. 区域和检索 - 数组不可变(一维前缀和问题)
  6. linux进程的高级管理,Linux高级程序设计(第2版) PDF扫描版[94MB]
  7. 【react】 使用react 脚手架 创建项目
  8. python游戏程序中游戏对象是什么_Python游戏编程入门
  9. 火星人学习第二周——虚幻引擎蓝图应用与开发
  10. 城市智慧水务供水测试床在工业互联网上发布
  11. 中国科学技术大学计算机考研好考吗,中国科学技术大学计算机考研复习方法谈(2)...
  12. QA团队和测试团队的关系
  13. java CGLIB动态代理
  14. java 重启路由器
  15. 可视化—三维图的绘制
  16. 更新3ds时和用读卡器读取传输文件操作不当导致的tf卡损坏无法读取需要格式化时出现的问题以及不想丢失文件并且修复的详细解决方法
  17. 摘几个陈年高校BBS的冷笑话
  18. 反射弧包括那些组成部分_反射弧的组成部分包括
  19. 熟读这5个开源项目就是合格的GO语言工程师
  20. 【杂谈第37期】用三句话了解BRD、MRD和PRD文档

热门文章

  1. js倒计时代码最简单的_32个史上最有用的js代码
  2. pta l2-7(家庭房产)
  3. zookeeper3.4集群搭建
  4. [转]ASP.NET 核心模块配置参考
  5. Java多线程相关知识
  6. Java SE7新特性之switch语句中使用字符串
  7. Apache CXF实战之六 创建安全的Web Service
  8. 个人项目中的WCF使用
  9. 如何把一个用户加入sodu组
  10. 《构建高可用Linux服务器》样书