socket编程与线程模型三

2、socket详解socket是一种特殊的I/O,所以socket类似于文件指针、文件 句柄。通过socket可以写入和读取数据。

socket原理图

socket这种I/O的特殊性在于创建了一个socket以后并不能马上进行数据读取 或者写入操作。它必须和一定的地址联系起来才可以操作。从无连接的协议看看 这个过程。

sendto(),首先执行sendto()的一方必须要知道对方的地址,才能 sendto(),也就是把数据写入一个socket。

无连接的socket

首先是数据的接受方创建一个socket,然后把一个地址SockAddr1与这个特殊 的I/O绑定。然后就可以从这个socket进行数据读取:recvfrom()。这个一般 是服务器方。

然后是客户端方面,它显然必须知道服务器端的SockAddr1这个地址才能写入 数据。所以,它创建一个特殊的I/O --- socket,然后就进行数据写入:sendto ()。这个时候sendto除了向指定的地址写入数据,还要隐式的给这个socket绑 定一个本地地址:SockAddr2。

服务方通过recvfrom()除了读取到客户提供的数据以外,还可以通过出口 参数获得发送者的地址。它使用sendto(),通过任何一个socket(用socket2 或者新建一个,新建是浪费资源,就用socket2就可以了)向客户端回写一些数 据。

上述情况时客户端给新建的socket通过sendto()隐式绑定地址,这个地址 是系统随机生成的。客户端也可以在sendto()之前采用bind()显式绑定一个 地址,然后sendto()就会采用这个显式绑定的地址作为源地址,但是不鼓励这 么做。

总结:socket是一种特殊的I/O,通过这种I/O可以读写数据。Socket在使用 的时候需要绑定一个地址,这个被绑定的地址就是应用程序用来读取的地址,也 就是接收数据的地址。而应用程序写入数据的地址,也就是发送数据的地址并不 是和socket需要绑定的,这个地址可以随意变换。所以,在无连接情况下,通过 同一个socket可以向多个地址写入数据,但是读取数据的地址只有一个,那就是 给这个socket绑定的地址。

无连接多点通信

上图所示的例子我们可以认为上方为服务器。服务器创建soctet1,然后与地 址SockAddr2显式绑扎。所以,SockAddr2就是服务器从socket1读取数据的地址 ,只有一个读取地址。

然后,3个客户端知道服务器地址SockAddr2,它们向服务器写入数据, sendto()。然后,服务器通过recvfrom()获取数据,并且获知三个客户端的 绑扎地址(隐式或者显式都可以)。服务器通过三个客户端的地址,通过同一个 socket--- socket1,向三个客户端分别写入数据。客户端通过recvfrom()得 到服务器数据。

对于一个socket,只能进行一次地址绑扎,即一次bind()。假如把上图认 为是一个客户端向三个服务器首先进行sendto()写入数据,客户端并没有显式 绑扎SockAddr2地址,那么客户端第一次调用sendto()的时候就会进行隐式绑 扎,以后就不会。第一次绑扎分配的SockAddr2不会再改变,三个服务器通过 recvfrom()获取到的源地址都是SockAddr2。

广播:从以上原理,可以知道无连接协议的广播是socket的发送地址的一个 特例,而与绑定地址和函数没有关系。只要设置sendto()的目的地址SockAddr 为广播类型就可以了。

时间: 2024-08-03 19:34:31

socket编程与线程模型三的相关文章

socket编程与线程模型一

这里线程模型是指winsock相关的线程模型设计. 在本软件的设计的过程中有些问题是涉及到winsock的问题,为了能够很好的 设计线程模型,必须理解清楚socket的内部工作机制.为此,首先从外面开始分 析. 一.为什么使用多线程 1.使用多线程是为了避免应用程序主界面在I/O操作中没有反应,出现假死 机现象. Socket是一种特殊的I/O,所以很可能会出现这种现象.例如发送数据,或者 连接服务器的时候. 2.为了提高cpu利用率(在多cpu环境)和改善应用程序的并发性能. 在多cpu环境,

socket编程与线程模型四

3.无连接socket与多线程 无连接socket很灵活,可以通过同一个socket 向很多个地址进行数据写入,从同一个地址进行数据读取.所以这种服务器的组 织形式也会很灵活.比如,利用多线程共享同一个服务器端的socket,进行数据 读取和写入. 但是需要注意,socket是特殊的I/O,既然属于I/O,那么 线程同步与互斥是非常重要的.因为它们读写socket的顺序将不能被保证,或者 无法预料.理论上一个端口号对应于不同的缓冲区,也就是端口号是tcp/ip协议 栈上数据缓冲区的句柄. 五.有

socket编程与线程模型五

2.socket地址 根据前面的分析,我们可以认为soket句柄和本地的绑定地址共同确定了协议 栈上的数据接收缓冲区或者read缓冲区.而协议栈上的写缓冲区或者发送是被公 用的(但是不同的协议无法公用,例如tcp和udp).所以,对同一个地址,不同 的socket可以收到不同的内容.但是对一个socket上的地址绑扎,无论是显式还 是隐式,只能进行一次. 3.并发连接 如果客户端掉用connect进行连接请求,多个客户端可能存在并发请求.服务 器会把不能响应的请求缓存在listen()指定了大小

socket编程与线程模型二

Winsock是windows系统上的一个网络通信API编程接口.TCP/IP协议栈只是 winsock通信的一个子集,winsock还可以支持除了tcp/ip之外的其它协议栈. BSD socket是unix上tcp/ip协议栈的编程接口,所以winsock和BSD套接字包含的 协议栈不一样.所以winsock编程中对于需要榜定的地址必须说明协议族和地址 类型等.因为它可以支持很多通信协议. winsock说明 图中紫色的长方形代表数据缓冲区,网卡和协议栈都有缓冲区.数据到达以 后,首先在网卡

续实例解析SOCKET编程模型之异步通信篇(上)

编程|异步 .NET 框架的 Socket 类实际上是 Winsock32 API 提供的套接字服务的托管代码版本.其中Socket 类为网络通信提供了一套丰富的方法和属性,大多数情况下,Socket 类方法只是将数据封送到它们的本机Win32 副本中并处理任何必要的安全检查.Socket 类允许使用 ProtocolType 枚举中所列出的任何一种协议执行异步和同步数据传输.Socket 类遵循异步方法的 .NET Framework 命名模式:例如,同步 Receive 方法对应于异步 Be

Java线程模型缺陷_JSP编程

Java 编程语言的线程模型可能是此语言中最薄弱的部分.它完全不适合实际复杂程序的要求,而且也完全不是面向对象的.本文建议对 Java 语言进行重大修改和补充,以解决这些问题. Java 语言的线程模型是此语言的一个最难另人满意的部分.尽管 Java 语言本身就支持线程编程是件好事,但是它对线程的语法和类包的支持太少,只能适用于极小型的应用环境. 关于 Java 线程编程的大多数书籍都长篇累牍地指出了 Java 线程模型的缺陷,并提供了解决这些问题的急救包(Band-Aid/邦迪创可贴)类库.我

Socket编程三

客户端 using System.Windows.Forms;using System.Net;using System.Threading;using System.Net.Sockets;namespace QQ{ public partial class Socketclient : Form { public Socketclient() { InitializeComponent(); } private void button1_Click(object sender, EventA

《C++多线程编程实战》——.7 线程模型的实现

2.7 线程模型的实现 我们可以把进程看作是一个对象,它的任务就是把相关资源分组.每个进程都有一个地址空间,如图2.10所示. 图2.10 进程的地址空间 这个所谓的进程图像必须在初始化CreateProcess时加载至物理内存中.所有的资源(如文件句柄.子进程的信息.信号处理器等)都被储存起来.把它们以进程的形式分组在一起,更容易管理. 除进程外,还有一个重要的概念是线程.线程是CPU可执行调度的最小单位.也就是说,进程本身不能获得CPU时间,只有它的线程才可以.线程通过它的工作变量和栈来储存

python之socket编程

From : http://www.cnblogs.com/aylin/p/5572104.html 1.socket         socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭)         基本上,Socket 是任何一种计算机网络通讯中最基础的内容.例如当你在浏览器