C# 网络编程之套接字编程基础知识

简介:

      最近阅读了周存杰编写的《C#网络编程实例教程》并阅读了很多相关方面的资料,同时自己也做了一些套接字编程方面的C#程序,所以根据它的知识总结了最近的套接字编程的一些知识点,方便自己的理解与他人的学习,同时也有一些自己以前学习的计算机网络、操作系统等相关知识。

一.   套接字编程的概念

      套接字(Winsock)是一种独立于协议的网络编程接口,在OSI中集中在会话层和传输层。(补充知识)简单回归网络知识,计算机网络中的”五层协议的体系结构”和”OSI体系结构”如下图所示:

      其中它们每层实现的功能,构成的网络通信简单的示意图如下图所示:(“网际层”对应”网络层”,”网络接口层”对应底层的”数据链路层+物理层”)

      TCP/IP协议的第一个BSD UNIX提供了一个访问通信协议的调用——Socker。Socket类提供了对套接字的支持,提供了一整套属性和方法实现对端口的绑定、监听、连接、数据传输,其中套接字编程接口使用的命名空间为System.Net.Sockets

      (补充知识).Net网络中常用的类如下所示:
      Socket:实现构造一个新的套接字接口对象
      Dns:提供简单的域名解析功能
      IPAddress:提供网际协议(IP)地址的支持,其方法含定义获取主机的IP地址
      IPEndPoint:将网络端点表示为IP地址和端口号
      IPHostEntry:为网络主机地址信息提供容器类,构造一个主机对象
      NetworkStream:提供用于网络访问的基础数据流
      TcpLinster:从TCP网络客户端监听连接
      TcpClient:为TCP网络服务提供客户端连接
      UdpClient:提供用户数据报(UDP)网络服务

二.Socket类属性

      Socket类常见属性如下所示:
      AddressFamily:定义套接字地址家族,常见的为InterNetwork
      Available:获取从网络已接受到的且可以读取的数据量的大小,存放网络缓冲区中还未处理的数据的大小
      Blocking:决定是否是套接字工作在阻塞模式,默认为False
      Connected:获取套接字是否连接成功的信息,True为连接成功,False为连接失败
      Handle:获取操作系统句柄
      LocalEndPoint:获取本地终端的信息
      ProtocolType:定义套接字使用的协议的类型,常见的为Tcp
      RemoteEndPoint:远程终端信息
      SocketType:定义套接字类型,数据流或数据包

      (补充知识)在网络编程中常使用的两种方法,socket类亦支持该两种基本模式——同步和异步。
      同步:对执行网络操作的函数的调用一只等到操作完成后才将控制返回给调用程序;
      异步:网络操作的函数调用立即返回。
      同步方法调用在程序继续执行之前需要等待同步方法执行完毕返回结果,异步方法则在被调用之后立即返回以便程序在被调用方法完成其任务的同时执行其它操作。
因为同步方法调用会导致程序流程中途等待,所以采用同步方法的情况下往往会导致程序执行的延迟,相比来说。在某些条件下选择异步方法调用就可能更好一些。

      举个例子:(引用别人的例子http://zhidao.baidu.com/question/97924815.html
      Socket传输中拿TCP传输为例。假设服务器A客户机B进行通信传输。
      首先需要在A机建立监听线程。监听某一端口,那么B机可以向A机发送通讯请求,B机连接到A机以后。A机可以从他的监听队列中取的一个监听对象。在A端拿到了这个Socket对象就可以进行接收跟发送数据了。这里问题就出现了。假如B端在请求A端的时候请求成功就发送一条数据。那么 A端就可以直接拿Socket对象得到他的信息。但是假如B端并没有在连接成功后直接发送信息而是在后来不确定的时间这内发送的信息。那么A端就无法得到这条信息。通常的做法是用一个定时器去不短的扫描这个数据缓存区。看是不是有数据存在这样效率非常低下。那么如何解决这个问题呢。
      就用到了我们的异步传输。异步传输的原理是:在A端得到这个SOCKET对象以后并不是直接去接收数据而是建立一个回调函数。回调函数是由系统维护的。他在指定的时间自动去扫描数据存储区。假如有数据他就把数据存储到指定的字节数组中,不用用户自己去关心。

三.Socket编程常用方法

这里主要介绍几种常用的套接字编程方法:

1.构造方法
构造一个新的套接字对象,该方法调用时前面须添加new,返回值为套接字对象实例.
public Socket(
    AddressFamilyaddressFamily, //网络类型
    SocketTypesocketType,           //套接字类型
    ProtocolTypeprotocolType);     //使用的协议
)

2.Bind()方法
绑定特殊端口用于监听
public void Bind(EndPoint loadEP) //本地主机,如IPEndPoint对象

3.Listen()方法
该方法用于监听端口
public void Listen(int bcaklog)  //最大可处理的连接数

4.Accept()方法
该方法用于决定套接字的状态,用于新建一个套接字处理新建的连接
public Socket Accept()    //返回值为新的套接字对象实例

5.BeginAccpet()和EndAccept()方法
该方法用于异步处理连接请求,与Accept()方法区别是Accept()立即处理连接请求,它是异步处理.
public IAsyncResult BeginAccept(
AsyncCallBack callback,  //异步回调
objecet state  //自定义对象
)
EndAccpet()用于结束一个处理异步连接请求和BeginAccept()方法配合使用.
public socket EndAccept(IAsynResult asyncResult)  //为处理的套接字请求,即BeginAccept()方法的请求.

      由于作者还在学习当中,还有很多方法,下面只提供方法名,具体的方法参数自己再去查找.包括Connect()、BeginConnect()\EndConnect()、Close()、send()、BeginSend()\EndSend()、SendTo()、BeginSendTo()\EndSendTo()、Receive()、BeginReceive()\EndReceive()、ReceiveFrom()、GetSocketOption()等方法.

四.总结

      上面的叙述就是我最近学习的C#网络编程关于套接字的一些基础知识的理解,其中主要的内容是根据阅读的书。同时参考了一些网上资料及自己学过的网络知识和操作系统知识,这篇总结对我以后的网络编程的学习很有帮组,希望也能帮组大家。同时如果有错误或不足之处,希望大家原谅!最后感谢我看的周存杰同志编写《C#网络编程实例教程》书籍。

    (BY:Eastmount 2013-7-13-夜10点http://blog.csdn.net/eastmount/

 

 

 

目录
相关文章
|
12天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
12天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
1月前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
19 0
|
2天前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。
|
2天前
|
程序员 C#
C#编程中的面向对象编程思想
【4月更文挑战第21天】本文探讨了C#中的面向对象编程,包括类、对象、封装、继承和多态。类是对象的抽象,定义属性和行为;对象是类的实例。封装隐藏内部细节,只暴露必要接口。继承允许类复用和扩展属性与行为,而多态使不同类的对象能通过相同接口调用方法。C#通过访问修饰符实现封装,使用虚方法和抽象方法实现多态。理解并应用这些概念,能提升代码的清晰度和可扩展性,助你成为更好的C#程序员。
|
3天前
|
IDE 程序员 C#
C#编程入门:从零开始的旅程
【4月更文挑战第20天】本文引导初学者入门C#编程,从环境搭建开始,推荐使用Visual Studio Community版作为IDE。接着,通过编写"Hello, World!"程序,介绍基本语法,包括数据类型、运算符和表达式。文章还涉及控制结构、函数和方法,以及面向对象编程概念。通过学习,读者将对C#有初步了解,并激发进一步探索编程世界的兴趣。
|
3天前
|
开发框架 .NET Java
探索 C#编程的奥秘与魅力
【4月更文挑战第20天】C#是微软开发的现代、面向对象的编程语言,以其简洁语法、强大功能和跨平台支持脱颖而出。它支持自动垃圾回收、泛型、委托、LINQ,并广泛应用于桌面、Web、移动和游戏开发。C#拥有活跃的开发者社区和丰富的资源,是Unity游戏开发的首选语言。随着.NET Core,C#可在多个操作系统上运行,持续创新,未来发展潜力巨大。
|
3天前
|
缓存 算法 测试技术
优化 C#编程性能的策略
【4月更文挑战第20天】优化C#性能策略包括:选择合适算法和数据结构,避免频繁对象创建,缓存常用数据,减少内存分配,使用异步编程,优化数据库操作(如合理查询和使用索引),利用多线程并行处理,精简代码,使用性能分析工具,硬件升级,以及进行性能测试。综合应用这些策略可提升程序性能和响应性。
|
8天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
11天前
|
网络协议 Java API
Python网络编程基础(Socket编程)Twisted框架简介
【4月更文挑战第12天】在网络编程的实践中,除了使用基本的Socket API之外,还有许多高级的网络编程库可以帮助我们更高效地构建复杂和健壮的网络应用。这些库通常提供了异步IO、事件驱动、协议实现等高级功能,使得开发者能够专注于业务逻辑的实现,而不用过多关注底层的网络细节。