socket编程与线程模型二

Winsock是windows系统上的一个网络通信API编程接口。TCP/IP协议栈只是 winsock通信的一个子集,winsock还可以支持除了tcp/ip之外的其它协议栈。 BSD socket是unix上tcp/ip协议栈的编程接口,所以winsock和BSD套接字包含的 协议栈不一样。所以winsock编程中对于需要榜定的地址必须说明协议族和地址 类型等。因为它可以支持很多通信协议。

winsock说明

图中紫色的长方形代表数据缓冲区,网卡和协议栈都有缓冲区。数据到达以 后,首先在网卡的缓冲区。这个时候,通过网卡驱动数据被拷贝到数据所属的协 议栈的缓冲区。最后,应用程序可以从协议栈的缓冲区把数据取走。当应用程序 发送数据,数据就会首先被缓存到协议栈的缓冲区,协议栈在适当的时候就会通 过网卡驱动把数据拷贝到网卡的缓冲区,最后数据就被网卡驱动发送到物理网络 上。但是需要明确,网卡的数据缓冲区比协议栈的小的多。所以,协议栈的缓冲 区内容是不断的积累网卡缓冲区内容的结果。

2、采用大缓冲区

Winsock API可以让程序员设置整个协议栈缓冲区的大小。把这个缓冲区设置 的大一点可以接受更多的客户同时发送数据,也可以支持暂时缓存应用程序发送 的数据。

也就是采用大缓冲区的时候,远端的发送程序不会因为协议栈缓存满而发送 失败;本地的应用程序也不会因为缓存满而发送失败。或者在流式套接字的时候 是发送被阻塞。

3、采用重叠I/O

采用重叠I/O可以提高应用程序收发数据的效率。

如图所示,采用重叠I/O以后数据就会直接从网卡的数据缓冲区拷贝到应用程 序的数据缓冲区,从而减少了协议栈的一个数据缓冲环节,消除了很多内存拷贝 操作。从而提高了应用程序的效率。

overlapped IO

时间: 2024-08-31 02:39:29

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

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

iOS网络编程入门:iOS中的Socket编程

使用Socket进行C/S结构编程,连接过程 服 务器端监听某个端口是否有连接请求.服务器端程序处于堵塞状态,直到客户端向服务器端发出连接请求,服务器端接受请求程序才能向下运行.一旦连接建立起 来,通过Socket可以获得输入输出流对象.借助于输入输出流对象就可以实现与客户端的通讯,最后不要忘记关闭Socket和释放一些资源(包括:关闭 输入输出流). 客户端流程是先指定要通讯的服务器IP地址.端口和采用的传输协议(TCP或UDP),向服务器发出连接请求,服务器有应答请求之后,就会建立连接.之后

iOS网络编程-iOS中Socket编程介绍

使用Socket进行C/S结构编程,连接过程   服务器端监听某个端口是否有连接请求.服务器端程序处于堵塞状态,直到客户端向服务器端发出连接请求,服务器端接受请求程序才能向下运行.一旦连接建立起来,通过Socket可以获得输入输出流对象.借助于输入输出流对象就可以实现与客户端的通讯,最后不要忘记关闭Socket和释放一些资源(包括:关闭输入输出流). 客户端流程是先指定要通讯的服务器IP地址.端口和采用的传输协议(TCP或UDP),向服务器发出连接请求,服务器有应答请求之后,就会建立连接.之后与

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

Java Socket编程实例(二)- UDP基本使用_java

一.服务端代码: import java.io.*; import java.net.*; public class UDPEchoServer { private static final int ECHOMAX = 255; // Maximum size of echo datagram public static void main(String[] args) throws IOException { int servPort = 5500; // Server port Datagr