[C#基础]网络编程(一):Socket

参考链接:

http://www.cnblogs.com/sunev/archive/2012/08/07/2625688.html

http://www.cnblogs.com/zengqinglei/archive/2013/04/30/3051629.html


socket的api:

https://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket(v=vs.110).aspx


socket常用api:

1.public enum AddressFamily:指定 Socket 类的实例可以使用的寻址方案。常用的取值为InterNetwork,表示IP 版本 4 的地址。

2.public enum SocketType:指定 Socket 类的实例表示的套接字类型。常用的取值为Stream,表示支持可靠、双向、基于连接的字节流。

3.public enum ProtocolType:指定 Socket 类支持的协议。常用的取值为Tcp,表示传输控制协议。

4.public class IPEndPoint:将网络端点表示为 IP 地址和端口号。可以通过IPEndPoint(IPAddress, Int32)这个构造函数指定端点的IP地址和端口号

5.public delegate void AsyncCallback(IAsyncResult ar):引用在相应异步操作完成时调用的方法。其中参数是异步操作的结果。

6.Socket.Blocking:可以设置socket是否处于阻止模式,默认为阻止模式,即true。如果当前处于阻止模式,并且进行了一个并不立即完成的方法调用,则应用程序将阻止执行,直到请求的操作完成后才解除阻止。如果希望在请求的操作尚未完成的情况下也可以继续执行,请将Blocking 属性更改为 false。Blocking 属性对异步方法无效。如果当前正在异步发送和接收数据,并希望阻止执行,请使用 ManualResetEvent 类。


//

同步下的socket:http://www.cnblogs.com/zengqinglei/archive/2013/04/27/3046119.html

服务器端:

1.创建套接字

2.绑定套接字到一个IP地址和一个端口上(bind())

3.将套接字设置为监听模式等待连接请求(listen())

4.请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept())

5.用返回的套接字和客户端进行通信(send()/receive())

6.返回,等待另一连接请求;

7.关闭套接字


客户端:

1.创建套接字

2.向服务器发出连接请求(connect())

3.和服务器端进行通信(send()/receive());

4.关闭套接字


注意一下accept、send、receive和connect这几个方法(tcp是面向连接的,udp不是面向连接的):

1.accept:同步方式,在阻止模式中,Accept 将一直处于阻止状态,直到传入的连接尝试排入队列。连接被接受后,原来的 Socket 继续将传入的连接请求排入队列,直到您关闭它。

2.send:同步方式,如果您使用的是面向连接的协议,则除非使用 Socket.SendTimeout 设置了超时值,否则,Send将一直处于阻止状态,直到发送完缓冲区中的所有字节如果超过超时值,Send 调用将引发SocketException。在非阻止模式下,Send 可能会成功完成,即使它发送的字节数小于缓冲区中的字节数。应由您的应用程序负责跟踪已发送的字节数并重试操作,直到应用程序发送了缓冲区中的字节数为止。不能保证发送的数据会立即出现在网络上。为提高网络效率,基础系统可能会延迟传输,直到收集了足够多的传出数据后才开始发送。 Send 方法的成功完成意味着基础系统有空间来缓冲用于网络发送的数据。

3.receive:同步方式,如果没有可读取的数据,则 Receive 方法将一直处于阻止状态,直到数据可用,除非使用Socket.ReceiveTimeout 设置了超时值。如果超过超时值,Receive 调用将引发SocketException。如果当前使用的是面向连接的 Socket,那么 Receive 方法将会读取所有可用的数据,直到达到缓冲区的大小为止

4.connect:同步方式,在阻止模式中,connect将一直处于阻止状态,直到建立了连接


//

异步下的socket:http://www.cnblogs.com/zengqinglei/archive/2013/04/30/3051629.html

1.在同步模式中,在服务器上使用Accept方法接入连接请求,而在客户端则使用Connect方法来连接服务器。相对地,在异步模式下,服务器可以使用BeginAccept方法和EndAccept方法来完成连接到客户端的任务,在客户端则通过BeginConnect方法和EndConnect方法来实现与服务器的连接。

2.因为采用异步的方式,所以没有必要再开启线程。


对应上面提到的四个同步方法,异步socket下有八个异步方法,以Begin和End开头(这里只列举两个,其余的是类似的):

1.public IAsyncResult BeginAccept(AsyncCallback callback,object state)     callback:回调方法   state:该请求的状态信息

至少必须通过 state 参数将实施侦听的 Socket 对象传递给 BeginAccept。如果您的回调需要更多信息,则可以创建一个小型类来保存 Socket 和其他必需的信息。通过 state 参数将此类的一个实例传递给 BeginAccept 方法。
回调方法应调用 EndAccept 方法。应用程序调用 BeginAccept 时,系统会使用单独的线程执行指定的回调方法,并在 EndAccept 上一直处于阻止状态,直到检索到挂起的连接。EndAccept 将会返回新的 Socket 对象,供您用来向远程主机发送数据和从远程主机接收数据。


2.public Socket EndAccept(IAsyncResult asyncResult)

它必须接受从 BeginAccept 方法返回的 asyncResult 参数。在回调方法中,调用 asyncResult 参数的 AsyncState 方法可以获取尝试连接的 Socket。获取了 Socket 之后,可以调用 EndAccept 方法成功地完成连接尝试。
EndAccept 方法将一直阻止到在传入连接队列中有一个连接挂起为止。EndAccept 方法接受传入的连接并返回一个新的 Socket,后者可用于将数据发送到远程主机或从远程主机接收数据。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值