惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
G
Google Developers Blog
雷峰网
雷峰网
WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
F
Full Disclosure
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
U
Unit 42
C
Cyber Attacks, Cyber Crime and Cyber Security
V
V2EX
C
Cisco Blogs
博客园 - 司徒正美
Project Zero
Project Zero
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
Scott Helme
Scott Helme
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
S
Securelist
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyberwarzone
Cyberwarzone
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
T
Threatpost
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
S
Security Archives - TechRepublic
博客园 - Franky
N
News | PayPal Newsroom
Simon Willison's Weblog
Simon Willison's Weblog
S
SegmentFault 最新的问题
W
WeLiveSecurity
A
Arctic Wolf
B
Blog

博客园 - wolfman

正则表达式Pattern 字符串分割成一维数组、二维数组,一维数组与二维数组之间的转换 ActiveMQ在C#中的应用 深入掌握JMS(十二):MDB 深入掌握JMS(十一):TemporaryQueue和TemporaryTopic 深入掌握JMS(十):JMSCorrelationID与Selector 深入掌握JMS(九):Selector 深入掌握JMS(八):JMSReplyTo 深入掌握JMS(七):DeliveryMode例子 深入掌握JMS(六):消息头 深入掌握JMS(四):实战Queue 深入掌握JMS(五):实战Topic 深入掌握JMS(三):MessageListener 深入掌握JMS(二):一个JMS例子 深入掌握JMS(一):JSM基础 oracle 分区表(转) Application,Session,Cookie,ViewState,Cache的区别(转) VS2008+Oracle92 网站发布注意问题 Windows Service开发应用
网络编程基础
wolfman · 2009-10-10 · via 博客园 - wolfman

网络编程主要是用到了两个协议:TCP和UDP

         TCP编程的特点:

              对于TCP,要记住的最重要的事情是它是一个面向链接的协议。两个设备之间一旦已经存在链接,就会形成一个可靠的数据流,保证数据从一个设备准确的移送到另一个设备。虽然使用TCP的用户不用担心数据的丢失和错位。但是,使用TCP编程的时候,需要的考虑的大问题是:缓冲区。

             由于TCP必须保证数据的完整性,所以,在从远程设备收到“已收到数据”的肯定的应答信息之前,它一直把所有发送的数据都存放在一个本地缓冲器中。同样地,当从网络接收数据的时候,TCP也必须有一个接收数据的本地缓冲器,以保证在把数据递送给应用程序之前所有的数据块是按顺序接收的。由于这个单独的TCP缓冲器,在用户程序与远程主机上目的程序之间移动数据操作起来显得比预期的困难一些。所以,无论是发送方还是接收方数据在发送或者接收的时候都会先放在缓冲区中。但是,TCP不保留数据消息的界线(数据块之间的边界),即缓冲区中的数据块被作为一个包发送。所以编程者必须在自己的网络程序中加以弥补。

        UDP编程的特点:

              创建UDP就是为了解决TCP的消息边界问题。UDP保留了从应用程序发送到网络上的所有消息的数据边界。由于UDP的特殊设计,不担心可靠数据的传输问题,它不需要使用本地缓冲器保留发送的或接收的数据。代替的做法是,当从应用程序接收到消息时,每条消息都作为一个单独的包转发。同样,从网络上收到的每条消息也作为一个单独的包转发给应用程序。UDP在网络包中保留了消息的边界。但是,由于UDP不保证数据的传递,所以如果涉及到数据到达目的地的问题,用户应用程序必须执行那种功能。因为一台设备发出了UDP数据包并不一定意味着接收设备收到数据包,所以用户必须保证用户的程序能够处理丢失包的问题。

        当程序需要分清服务器和客户机的时候,最好使用TCP协议,而UDP一般是在主次不是分的很清楚(即关系平等)的时候用到。

Socket篇:

         System.Net.Sockets命名空间包含一些可以给低级的Winsock API提供实际.NET接口类.

         (1)套接字的结构:

         System.Net.Sockets命名空间的核心是Socket(套接字)类。它提供了Winsock API的C#管理代码的实现。Socket类的构造函数如下:

         Socket(AddressFamily  af,  SocketType  st,  ProtocolType  pt)

         它用三个参数定义创建的套接字类型:

              用AdressFamily定义网络的类型

              用SocketType定义数据连接的类型

              用ProtocolType指定具体的网络协议

         这些参数的每一个都可以用System.Net.Sockets命名空间中一个单独的枚举来表现。每个枚举都包含可以使用的值。对网络上的IP通信,AddressFamily应当总是用AdressFamily.

InterNetwork值。使用InterNetwork AdressFamily,SocketType参数必须与特定的ProtocolType参数相匹配。不允许用户把SocketTypes和protocolTypes混淆匹配。

         (2)使用面向连接的套接字:

          .NET框架中,用户可以跨过网络与远程主机建立面向连接的通信。由于C#是一个面向对象的语言,所以套接字作为Socket类的方法实现。借助于从Socket实例对方法的引用,用户可以用显示的套接字执行网络操作。

          服务器函数:

          在服务器套接字建立之后,必须把它绑定到系统中的一个本地网络地址。Bind()方法就用于完成这一功能:

           Bind(EndPoint  adress)

           address参数必须指向一个有效的IPEndPoint实例,该实例包含一个本地IP地址和一个端口号。在套接字绑定到本地地址之后,就用Listen方法等待客户机发出的连接尝试:

           Listen(int backlog)

           backlog参数指出系统等待用户程序服务排队的连接数。超过等待连接数的任何客户的尝试都会被拒绝。用户应当记住,在这里指定一个大的编号可能会造成用户的服务器程序被执行的结果。每个待解决的连接尝试都暂存在TCP缓冲器区中缓存器空间,这意味着只有较少的缓冲器空间用于发送和接收包。

            在Listen方法执行过之后,服务器已经做好了接收任何引进连接的准备。这是用Accept方法完成的,该方法返回一个新的套接字描述符,这个连接所有的通信调用都可以使用该描述符。

            客户机函数

            客户机设备也必须把一个地址绑定到创建的Socket对象,使用Connect方法,像Bind函数一样,Connect也要求一个客户机需要连接的远程设备的IPEndPoint对象。

            一旦连接已经建立,客户机就可以像服务器使用的方法一样,使用Socket类的Send和Receive方法。当通信完成之后,必须把Socket实例关闭。

            (3)使用无连接的套接字

             当用户使用Socketype.Dgram套接字类型创建套接字的时候,用UDP协议在网络上传输包。用户必须为服务器设置Bind方法,在特定的端口建立套接字。服务器与客户机不需要使用Listen和Connect方法。

             由于没有为通信而建立连接,所以标准的Receive和Send方法不起作用。用户必须用特殊的ReceiveFrom和SentTo方法。

             (4)无阻塞编程技术

              .NET Socket类的I/O方法在默认情况下使用阻塞的方法。当一个程序到达被阻碍的网络函数时,程序需要在那里等待,知道函数完成后才能继续。有三个可以避免使用阻塞网络调用的C#技术:无阻塞套接字,多路传输套接字和一部套接字。

                 无阻塞套接字:

                  C# Socket对象包含有多个可以查询它们值的属性。不过,其中有一个Blocking属性也可以被设置。用户可以把一个套接字的Blocking属性设置成假(false),使的套接字编程无阻塞模式。当套接字是无阻塞模式的时候,它就会不等待一个I/O方法的完成。它将会检查这个方法,如果它不能完成,这个方法会失败,而程序会继续进行。

                 多路传输套接字

                   Socket类提供了Select方法。这个方法用于多路传输多个套接字实例,以便找到一个已经准备读或写的套接字。

                 异步套机子编程技术

                 .NET框架使用有Windows Winsock API推出的异步套接字模式。这种方法在套接字准备接收或发送数据的时候,允许用户使用单独的方法。用户不是用Receive方法等待来自客户机的数据,而是使用BeginReceive方法,这种方法会注册一个当套接字上的数据可用时可以被调用的代表(委托delegate)。在代表方法中,用户必须用EndReceive方法阻止从套接字异步读和检索数据。

原文:http://cancel.blog.51cto.com/133022/37651