socket编程与线程模型二

socket编程与线程模型二

 

三、socket编程中的要点

1、socket基本结构

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

socket编程与线程模型二

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

2、采用大缓冲区

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

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

3、采用重叠I/O

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

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

socket编程与线程模型二

                                                                 overlapped IO

 

四、无连接的winsock

1、概述

网络中可以用一个三元组全局唯一地标志一个进程,这个三元组的结构是:(协议、本地地址、本地端口号)。这个三元组叫做一个半相关。

一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议(如tcpudp)。就是说不可能一端用tcp,另一端用udp。因此,一个完整的网间通信需要一个五元组来标识:(协议、本地地址、本地端口好、远地地址、远地端口号)。这样一个五元组叫做全相关。也就是同一个协议的两个半相关才能组成一个全相关,也就是一个连接。

socket编程与线程模型二

                                                             无连接的socket

 

Bind()与是否面向连接有关。产生一个socket以后,Bind()把套接字与本地的一个端口相关联。也就是进程在系统中为自己的通信登记一个地址。这个就类似于为一个服务指定一个电话号码,例如114查询服务或者一个客服热线。而创建一个socket的举措类似于建立一个服务,但是没有指定一个电话号码之前(Bind之前),客户无法与之通信。Bind以后,服务方必须让客户知道这项服务的号码,也就是一个半相关(协议、本地地址、本地端口号)。

Bind()是显式绑定,客户端一般不一定要显式绑定,例如通过connect()、Sendto()等几个方法可以附带绑定,产生客户端半相关。如果客户端显式绑扎,那么客户端其实和一个服务端在概念上没有区别了。在多点对等通信模型中这一点很重要。

首先发送方知道对方的地址,通过sendto()发送数据;接收方通过recvfrom()接收数据,通过这个函数的出口参数可以获知发送方的地址,然后就可以回送数据。所以客户端没有必要显式bind()一个地址。服务器方之所以需要bind()一下,是因为它首先调用recvfrom(),这个接口的参数要求一个已经帮扎了本地地址的socket。如果客户端也显式绑扎一个地址,它就具备了端到端的网络通信的能力了。

socket编程与线程模型二

                                                        无连接的socket二

   

如图所示的无连接socket编程模型,其客户端并没有使用Bind()显式提供半相关。它是通过Sendtorecvfrom进行附带绑扎。那么服务端如何回送数据呢?recvfrom()提供了一个出口参数,用来返回源地址,通过这个源地址,服务端可以回送数据到客户端。

如图所示的无连接socket编程模型,其客户端并没有使用Bind()显式提供半相关。它是通过Sendtorecvfrom进行附带绑扎。那么服务端如何回送数据呢?recvfrom()提供了一个出口参数,用来返回源地址,通过这个源地址,服务端可以回送数据到客户端。

 

转载于:https://www.cnblogs.com/worldreason/archive/2008/05/09/1189871.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111021.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ldd 命令介绍_ldr指令是什么意思

    ldd 命令介绍_ldr指令是什么意思1.在制作自己的发行版时经常需要判断某条命令需要哪些共享库文件的支持,以确保指定的命令在独立的系统内可以可靠的运行;在Linux环境下通过ldd命令即可实现,在终端下执行:ldd/bin/ls//ldd命令通常使用”-v”或”–verbose”选项来显示所依赖的动态连接库的尽可能的详细信息。即可得到/bin/ls命令的相关共享库文件列表:libtermcap.so.2=>/lib/lib

    2022年5月3日
    65
  • 行为识别数据集汇总[通俗易懂]

    行为识别数据集汇总[通俗易懂]工欲善其事,必先利其器http://www.cs.utexas.edu/~chaoyeh/web_action_data/dataset_list.html,此链接内容更全,可惜整理完后发现的。1.TheKTHDataset(2004)KTH数据集于2004年的发布,是计算机视觉领域的一个里程碑。此后,许多新的数据库陆续发布。数据库包括在4个不同场景下25个人完成的6…

    2022年6月21日
    72
  • 用计算机套路别人,套路计算器隐藏版[通俗易懂]

    用计算机套路别人,套路计算器隐藏版[通俗易懂]套路计算器隐藏版是款非常适合撩妹的神器,各种整蛊玩法,套路你的女朋友,操作简单,不需要root免费使用,轻松的哄女朋友开心。套路计算器隐藏版特色1.在这里都可以跟你的好友们设定任何的计算套路。2.在使用的时候看起来就跟普通的计算器应用差不多。3.他的套路秘诀就在输入计算结果之后,会显示提前设定的文字。4.各种的文章内容都可以设定到计算里面。套路计算器隐藏版怎么用进入的先设置好内容,进入后打开的都是…

    2022年6月9日
    136
  • CreateFileMapping函数[通俗易懂]

    为指定文件创建或打开命名或未命名的文件映射对象。要为物理内存指定NUMA节点,请参阅CreateFileMappingNuma。语法HANDLEWINAPICreateFileMapping(_In_HANDLEhFile,_In_opt_LPSECURITY_ATTRIBUTESlpAttributes,_In_DWORDflProtect,…

    2022年4月6日
    54
  • Document类型、HTMLDocument类型和document对象的区别[通俗易懂]

    Document类型、HTMLDocument类型和document对象的区别[通俗易懂]Dcoment表示文档,这里的文档可以是HTML文档,也可以是XML文档,换句话说Document类型能表示HTML和XML等文档; HTMLDocument对象继承自Document对象,专用于表示HTML文档; document对象是HTMLDocument对象的一个实例,表示整个HTML页面,又叫做页面的根节点;Document对象(根节点)的特征:<!DOCTYPEht…

    2022年7月19日
    29
  • java protostuff 序列化_使用Protostuff序列化

    java protostuff 序列化_使用Protostuff序列化序rpc调用,有多种序列化的方式,通用如json,mongodb使用的bson;java方面的,比如Java默认的序列化,比如hessian;还有跨语言的,比如thrift、protocolbuf。thrift和pb的好处是序列化后size比较小,但是缺点是得生成java代码,这个挺鸡肋的,所以不管二者运行时效率有多高,开发效率相对比较低的。像hessian,是有一些在用,但是感觉不如pb那样强大…

    2022年5月5日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号