socket编程与线程模型五

2、socket地址

根据前面的分析,我们可以认为soket句柄和本地的绑定地址共同确定了协议 栈上的数据接收缓冲区或者read缓冲区。而协议栈上的写缓冲区或者发送是被公 用的(但是不同的协议无法公用,例如tcp和udp)。所以,对同一个地址,不同 的socket可以收到不同的内容。但是对一个socket上的地址绑扎,无论是显式还 是隐式,只能进行一次。

3、并发连接

如果客户端掉用connect进行连接请求,多个客户端可能存在并发请求。服务 器会把不能响应的请求缓存在listen()指定了大小的请求队列。这个时候被缓 存了请求的客户端connect()方法会正确返回,并继续执行。但是会在 send和 recv方法上被阻塞等待。

如果并发数目大于连接请求的缓冲区大小,那么不能被缓存的那些连接 connect()方法会返回(暂不清楚有没有返回错误)。但是在这个socket上调 用send或者recv方法,就会返回错误结果。

所以,如果连接请求的服务过程比较费时间,那么为了不至于被缓存请求的 客户端长时间等待和另一些客户端连接失败,一般需要采用多线程方式。因为把 服务交给子线程以后,主线程总有机会accept更多的请求。所以,除了把请求队 列设置大一些,多线程也是改善服务的方法。

4、connect()

connect()有一个作用,从面向连接的例子看就是把一个数据发送或者写入 地址帮顶到套接字上,从而使得该套接字绑定了两个地址。显式绑扎发送地址和 隐式绑扎接收地址。

无连接的协议也可以调用connect(),但是这种情况下connect()并不会 向服务器进行连接请求。这个时候就是把一个地址显示绑扎到某个套接字,使它 具备一个关联的数据发送地址。这样,无连接协议也可以使用send()和recv( )在这样一个套接字上写如和读取数据。虽然已经绑扎了一个默认的发送地址, 但是通过sendto()又可以把数据发送到非默认的地址。

bind()用来显式给一个socket绑扎一个数据读取地址,这是本地地址。客 户端不鼓励这种方式,而是采用隐式绑扎。但是如果显式绑扎了也不会错。

时间: 2024-08-02 05:13:16

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编程与线程模型二

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

socket编程与线程模型三

2.socket详解socket是一种特殊的I/O,所以socket类似于文件指针.文件 句柄.通过socket可以写入和读取数据. socket原理图 socket这种I/O的特殊性在于创建了一个socket以后并不能马上进行数据读取 或者写入操作.它必须和一定的地址联系起来才可以操作.从无连接的协议看看 这个过程. sendto(),首先执行sendto()的一方必须要知道对方的地址,才能 sendto(),也就是把数据写入一个socket. 无连接的socket 首先是数据的接受方创建一个

续实例解析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/邦迪创可贴)类库.我

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

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

Java Socket编程实例(五)- NIO UDP实践_java

一.回传协议接口和UDP方式实现: 1.接口: import java.nio.channels.SelectionKey; import java.io.IOException; public interface EchoProtocol { void handleAccept(SelectionKey key) throws IOException; void handleRead(SelectionKey key) throws IOException; void handleWrite(

python之socket编程

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