c# Socket属性

最近在弄一个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 属性更改为 falseBlocking 属性对异步方法无效。如果当前正在异步发送和接收数据,并希望阻止执行,请使用 ManualResetEvent 类。

注意:
如果收到  SocketException ,请使用  SocketException.ErrorCode  属性获取特定的错误代码。获取此代码后,您可以参考 MSDN Library 中的 Windows Sockets 第 2 版 API 错误代码文档,获取有关该错误的详细说明。
当在应用程序中启用网络跟踪功能后,此成员将输出跟踪信息。有关更多信息,请参见 网络跟踪


Socket.Connected 属性

获取一个值,该值指示 Socket 是在上次 Send 还是 Receive 操作时连接到远程主机。

命名空间:System.Net.Sockets
程序集:System(在 system.dll 中)

public bool Connected { get; }
J#
/** @property */
public boolean get_Connected ()

public function get Connected () : boolean

属性值
如果  Socket 在最近操作时连接到远程资源,则为  true;否则为  false

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) 数据报分段。

如果数据报大小超过传输介质的最大传送单位 (MTU),则需要将数据报分段。可以由发送主机(所有版本的 Internet 协议)或中间路由器(仅 Internet 协议版本 4)将数据报分段。如果必须将一个数据报分段,并且已设置 DontFragment 选项,则该数据报被丢弃并且将 Internet 控制消息协议 (ICMP) 错误信息发送回数据报发送方。

对传输控制协议 (TCP) 套接字设置此属性不起任何作用。

下面的代码示例阐释了如何使用 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);
}
未完待续




  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值