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/

 

 

 

时间: 2025-01-29 07:54:10

C# 网络编程之套接字编程基础知识的相关文章

Windows Socket网络编程(二) 套接字编程原理

一.客户机/服务器模式 在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model).该模式的建立基于以下两点:1.非对等作用:2.通信完全是异步的.客户机/服务器模式在操作过程中采取的是主动请示方式: 首先服务器方要先启动,并根据请示提供相应服务:(过程如下) 1.打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求. 2.等待客户请求到达该端口. 3.接收到重复服务请求,处理该请求并发送应答信号. 4.返回第二步,等待另一客户

[python] 专题七.网络编程之套接字Socket、TCP和UDP通信实例

        很早以前研究过C#和C++的网络通信,参考我的文章:                  C#网络编程之Tcp实现客户端和服务器聊天                 C#网络编程之套接字编程基础知识                 C#网络编程之使用Socket类Send.Receive方法的同步通讯        Python网络编程也类似.同时最近找工作笔试面试考察Socket套接字.TCP\UDP区别比较多,所以这篇文章主要精简了<Python核心编程(第二版)>第16章内

【转】Windows Socket网络编程(二)----套接字编程原理

Windows Socket 网络编程(二) -- 套接字编程原理作者: 冰点工作室 小鹰 一.客户机/服务器模式在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model).该模式的建立基于以下两点:1.非对等作用:2.通信完全是异步的.客户机/服务器模式在操作过程中采取的是主动请示方式: 首先服务器方要先启动,并根据请示提供相应服务:(过程如下)1.打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求.2.等待客户请求到达该端

《UNIX网络编程 卷1:套接字联网API(第3版)》——第8章 基本UDP套接字编程 8.1概述

第8章 基本UDP套接字编程 8.1 概述 在使用TCP编写的应用程序和使用UDP编写的应用程序之间存在一些本质差异,其原因在于这两个传输层之间的差别:UDP是无连接不可靠的数据报协议,非常不同于TCP提供的面向连接的可靠字节流.然而相比TCP,有些场合确实更适合使用UDP,我们将在22.4节探讨这个设计选择.使用UDP编写的一些常见的应用程序有:DNS(域名系统).NFS(网络文件系统)和SNMP(简单网络管理协议). 图8-1给出了典型的UDP客户/服务器程序的函数调用.客户不与服务器建立连

网络数据抓包 windows- VC++ 用原始套接字编程,怎样抓取网页响应数据?

问题描述 VC++ 用原始套接字编程,怎样抓取网页响应数据? 在网上找了很多方法,都是只能抓取发出的请求数据,没有响应数据 recv(sock, recvInf, sizeof(recvInf), 0);//接收包 windows环境下,VS2015 解决方案 参考:http://www.codeproject.com/Articles/17031/A-Network-Sniffer-in-Chttp://www.netresec.com/?page=RawCap 解决方案二: 这个是开发给特定

PHP套接字编程

编程 作者:久隆信息/张晓刚 套接字编程,一般使用c或c++.特别的在web应用程序开发中,常用perl实现套接字.除此以外,用php进行套接字编程也是一个选择.Php可以胜任吗?当然可以.Php是一门高质量的web应用程序开发语言,他的许多特性可以处理众多的任务,网络编程也不例外. 1. 理解套接字 Mail.ftp.telnet.name和finger这些服务都是在一个专用的公开的端口上提供的,通过连接到这些端口,客户程序就能够访问这些服务.这与现实生活是相似的--当需要干洗衣服的时候,找干

套接字编程简介

套接字编程简介 项目:UNIX网络编程学习 作者:曾金龙 供职:(深圳迅雷网络技术股份有限公司) 领域:迅雷下载库研发 日期:2014-07-25 1, TCP连接图 socket编程,过眼烟云的去看,无外乎就那么几个API,但是,如果想登堂入室,必须注重里面的每一个细节. 对于TCP编程而言,最重要的是记住这么一幅图.死记的基础上理解. windows下有visio,ubuntu下只好用Dia,不是很习惯,而且不支持中文输入. 图1 TCP连接的数据包交换图 你特别需要注意的是: 1)哪个地方

windows和linux的tcp套接字编程实例代码

windows下面的代码如下面 //Server.cpp #include <iostream> #include <windows.h> #define IP "127.0.0.1" #define PORT 8888 #pragma comment(lib,"ws2_32.lib") using namespace std; char* GetTime(); int main() {     WSADATA wsaData;     WO

TCP套接字编程模型及实例

摘要:     本文讲述了TCP套接字编程模块,包括服务器端的创建套接字.绑定.监听.接受.读/写.终止连接,客户端的创建套接字.连接.读/写.终止连接.先给出实例,进而结合代码分析.   PS:本文权当复习套接字编程的读书笔记.   一.TCP套接字编程模型     同一台计算机上运行的进程可以利用管道.消息队列.信号量.共享内存等进行相互通信,不同计算机上运行的进程可以通过套接字网络IPC接口进行相互通信.套接字编程基本步骤如下图所示: 图 TCP套接字编程模型[1] 二.源代码     本