最近在弄一个untity3D 的一个项目,目前在写网络模块,第一次接触c#,把一边学习,一边总结的Socket知识分享一下:
Socket.AddressFamily 属性
AddressFamily 指定 Socket 类的实例可以使用的寻址方案。此属性为只读属性,它在创建 Socket 时设置。Socket s = new Socket (lep.Address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); //Using the AddressFamily, SocketType, and ProtocolType properties. Console.WriteLine ("I just set the following properties of socket: " + "Address Family = " + s.AddressFamily.ToString () + "\nSocketType = " + s.SocketType.ToString () + "\nProtocolType = " + s.ProtocolType.ToString ());
Socket.Available 属性
属性值
从网络接收的、可供读取的数据的字节数。备注
如果当前使用的是非阻止 Socket,一种较好的做法是在调用 Receive 之前使用 Available 来确定数据是否排队等待读取。可用的数据即网络缓冲区中排队等待读取的全部数据。如果在网络缓冲区中没有排队的数据,则 Available 返回 0。
如果远程主机处于关机状态或关闭了连接,则 Available 会引发 SocketException。如果收到 SocketException,请使用 SocketException.ErrorCode 属性获取特定的错误代码。获取此代码后,您可以参考 MSDN Library 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关该错误的详细说明。
示例
// FIONREAD is also available as the "Available" property. public const int FIONREAD = 0x4004667F; static void DisplayPendingByteCount(Socket s) { byte[] outValue = BitConverter.GetBytes(0); // Check how many bytes have been received. s.IOControl(FIONREAD, null, outValue); uint bytesAvailable = BitConverter.ToUInt32(outValue, 0); Console.WriteLine("server has {0} bytes pending. Available property says {1}.", bytesAvailable, s.Available); return; }
Socket.Blocking 属性
Blocking 属性指示 Socket 是否处于阻止模式。
如果当前处于阻止模式,并且进行了一个并不立即完成的方法调用,则应用程序将阻止执行,直到请求的操作完成后才解除阻止。如果希望在请求的操作尚未完成的情况下也可以继续执行,请将 Blocking 属性更改为 false。Blocking 属性对异步方法无效。如果当前正在异步发送和接收数据,并希望阻止执行,请使用 ManualResetEvent 类。
注意:Socket.Connected 属性
获取一个值,该值指示 Socket 是在上次 Send 还是 Receive 操作时连接到远程主机。
命名空间:System.Net.Sockets
程序集:System(在 system.dll 中)
Connected 属性获取截止到最后的 I/O 操作时 Socket 的连接状态。当它返回 false 时,表明 Socket 要么从未连接,要么已断开连接。
Connected 属性的值反映最近操作时的连接状态。如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。
如果调用用户数据报协议 (UDP) 套接字上的 Connect,则 Connected 属性始终返回 true;不过,此操作不更改 UDP 的内在无连接特性。
下面的代码示例连接到远程终结点,请检查 Connected 属性,然后检查连接的当前状态。
// .Connect throws an exception if unsuccessful client.Connect(anEndPoint); // This is how you can determine whether a socket is still connected. bool blockingState = client.Blocking; try { byte [] tmp = new byte[1]; client.Blocking = false; client.Send(tmp, 0, 0); Console.WriteLine("Connected!"); } catch (SocketException e) { // 10035 == WSAEWOULDBLOCK if (e.NativeErrorCode.Equals(10035)) Console.WriteLine("Still Connected, but the Send would block"); else { Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode); } } finally { client.Blocking = blockingState; } Console.WriteLine("Connected: {0}", client.Connected);
Socket.DontFragment 属性
获取或设置 Boolean 值,该值指定 Socket 是否允许将 Internet 协议 (IP) 数据报分段。下面的代码示例阐释了如何使用 DontFragment 属性。
static void ConfigureUdpSocket(Socket udpSocket) { // set the Don't Fragment flag. udpSocket.DontFragment = true; // Enable broadcast. udpSocket.EnableBroadcast = true; // Disable multicast loopback. udpSocket.MulticastLoopback = false; Console.WriteLine("Udp Socket configured:"); Console.WriteLine(" DontFragment {0}", udpSocket.DontFragment); Console.WriteLine(" EnableBroadcast {0}", udpSocket.EnableBroadcast); Console.WriteLine(" MulticastLoopback {0}", udpSocket.MulticastLoopback); }