WinSocket 编程
套接字
套接字指通信双方在通信时所使用的通信点(Endpoint),通信的双方通过通信点来交换信息和数据。不同类型的通信会使用不同的类型通信点,比如对于电话通信而言,通信点就是电话号码和分机号码的组合,这时因为如果你想和朋友通话,就需要拨打你朋友的电话号码和分机号码。对于IP网络通信而言,通信点就是套接字,即两个进程在进行网络通信的时候,他们通过套接字来交换信息和数据。
和电话通信类似,当一个进程想和另一个进程进行网络通信时,它必须知道另外一个进程所在的目标机器IP地址,同时也必须有一种机制来标识目标机器上的进程,这种机制就是我们前面章节提到的端口号,目标机器正是通过端口号才能确定应该把接收到的数据发往哪一个进程。也就是说套接字这种通信点必须通过端口号标识和IP地址,另外由于网络通信也有不同类型,同一个端口号在使用不同的传输层协议时含义是不一样的,所以套接字还和传输层协议有关。
一个套接字包含:
- IP地址
- 端口号
- 传输协议
一个已连接的TCP套接字对应如下:
【本地IP,端口,目标机IP,端口】
服务器可以分为迭代服务器和并发服务器
迭代服务器工作方式如下(UDP):
- 等待客户请求
- 当接受到客户请求时,处理该请求并把结果返回该客户
- 回到步骤1,继续等待下一个客户请求。
并发服务器的工作方式如下(TCP):
- 等待客户请求
- 当接收到客户请求,为该客户开启一个新的服务器实例(进程、线程等),并且由这个新的服务器实例来处理该客户的请求并把结果返回客户,之后该新的服务器实例就终止。
- 回到步骤一,继续等待下一个客户请求
TCP客户端与服务器交互过程
TCP服务器端连接套接字创建、关闭交互过程说明如下:
- 服务器创建一个套接字。
- 服务器把本地套接字地址(本地IP地址和本地端口)绑定(Bing)到该套接字。客户端将使用在这里的绑定的套接字地址来连接到该服务器
- 服务器把该套接字置为等待状态,也叫(Listen)这时套接字也被称为监听套接字。
- 服务器开始接受(Accept)客户端的连接请求。如果这时没有连接求,则服务器就等待请求的到来;如果有连接请求,则服务器为该连接请求创建一个新的套接字,该新的套接字用来描述这个连接,既它对应于一个四元组:[本地IP地址,本地端口,远程IP地址,远程端口]。我们把这个新的套接字被称为已连接套接字,以便于区分监听套接字。
- 服务器使用已经连接的套接字来接受来自客户端的数据,或者发送数据到客户端。
- 当完成和客户端的数据交互之后,服务器关闭套接字。
一般来说,当服务器创建了已连接套接字后,会生成一个新的服务器实例(线程或进程等)。然后这个新的实例执行5,、6步,即处理和客户端的数据交互。
TCP客户端
TCP客户端连接套接字创建,关闭过程说明
- 客户端创建一个套接字
- 客户端把本地套接字地址(本地IP地址和本地端口)绑定到套接字。注意,这个步骤对于客户端来说不是必须的。如果执行的话就按四元组中的地址分配,如果没有执行则系统自动分配地址。
- 客户端使用在步骤1中创建的套接字来连接(Connect)到一个远程套接字的地址(远程IP地址和远程端口),即服务器的监听套接字地址。在连接成功之后,这个连接将由客户端套接字来描述,这个客户端套接字也对应于一个四元组:[本地IP地址,本地端口,远程IP地址,远端端口]。此时,这个客户端套接字也成为一个连接套接字。
- 客户端使用已连接套接字发送来发送数据到服务器,或者接受来自服务器的数据。
- 当完成和服务器的数据交互之后,客户端关闭连接套接字。
这整个过程都只有一个套接字和一个客户端实例
WinSocket 编程的更多相关文章
- winsocket编程笔记(一)
前言: 因为疫情原因,现在一直在网上授课,教师在讲述winsocket这一课程时没有给予我们课本,只有毫不相搭的linux环境的socket编程视频,故于此(开学第七周)总结winsocket的内容. ...
- winSocket编程(十)完成端口
//本篇为转贴 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中……酝酿了两年之后,终于决定开始动笔了,但愿还不算晚….. 这篇文档我非 ...
- winSocket编程(九)重叠IO
重叠模型的优点 重叠模型的基本原理 关于重叠模型的基础知识 重叠模型的实现步骤 多客户端情况的注意事项 一.重叠模型的优点 1.可以运行在支持Winsock2的所有Windows平台 ,而不像完成端口 ...
- winSocket编程(一)WSAStartup
/******************************************************************** 更新日期:2017-11-07 10:33:08* 进度:完 ...
- 用Delphi实现WinSocket高级应用
用Delphi实现WinSocket高级应用 默认分类 2009-12-19 16:48 阅读6 评论0 字号: 大大 中中 小小 Socket通信在Windows 中是排队的形式 ...
- 5、QT分析之网络编程
原文地址:http://blog.163.com/net_worm/blog/static/127702419201002842553382/ 首先对Windows下的网络编程总结一下: 如果是服务器 ...
- QT分析之网络编程
原文地址:http://blog.163.com/net_worm/blog/static/127702419201002842553382/ 首先对Windows下的网络编程总结一下: 如果是服务器 ...
- C语言面试题大汇总之华为面试题 Eddy整理
1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局 ...
- loadrunner测试TCP协议服务器性能
loadrunner测试TCP协议服务器性能 . 性能loadrunner测试c 最近对服务器的性能感兴趣,于是开始研究了一阵子loadrunner如何做采用TCP协议交互的服务器的性能测试,对loa ...
随机推荐
- Hdu4786
Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 【甘道夫】Sqoop1.99.3基础操作--导入Oracle的数据到HDFS
第一步:进入clientShell fulong@FBI008:~$ sqoop.sh client Sqoop home directory: /home/fulong/Sqoop/sqoop-1. ...
- UVa 10069 Distinct Subsequences(大数 DP)
题意 求母串中子串出现的次数(长度不超过1后面100个0 显然要用大数了) 令a为子串 b为母串 d[i][j]表示子串前i个字母在母串前j个字母中出现的次数 当a[i]==b[j]&am ...
- HDU 5274(LCA + 线段树)
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- Python库之pyudev (一)
库pyudev是libudev的python封装,libudev提拱了对本地设备的列举与查询API. 1.安装 pip install pyudev 2. 使用 2.1 开始 导入pyudev,验证库 ...
- Unity Image Effect
1.工作原理 Image Effect是运用于一个Camera,将Camera视见体最终看到的二维图像内容作为一个2DTexture传递给一个Shader, 然后在Shader的Fragment渲染阶 ...
- thinkphp5项目--个人博客(五)
thinkphp5项目--个人博客(五) 项目地址 fry404006308/personalBlog: personalBloghttps://github.com/fry404006308/per ...
- sicily 1004. 简单哈希
Description 使用线性探测法(Linear Probing)可以解决哈希中的冲突问题,其基本思想是:设哈希函数为h(key) = d, 并且假定哈希的存储结构是循环数组, 则当冲突发生时, ...
- [C++] upper_bound和lower_bound
upper_bound 源码 template <class ForwardIterator, class T> ForwardIterator upper_bound (ForwardI ...
- SQL_触发器学习
--触发器学习-------------------------------------------------------------------------------after 触发器----- ...