MSDN上对于Socket类的介绍

Socket 类为网络通信提供了一套丰富的方法和属性。Socket 类允许您使用 ProtocolType 枚举中所列出的任何一种协议执行异步和同步数据传输。Socket 类遵循异步方法的 .NET Framework 命名模式;例如,同步 Receive 方法对应于异步 BeginReceive 和 EndReceive 方法。
如果应用程序在执行期间只需要一个线程,请使用下面的方法,这些方法适用于同步操作模式。
如果当前使用的是面向连接的协议(如 TCP),则服务器可以使用 Listen 方法侦听连接。Accept 方法处理任何传入的连接请求,并返回可用于与远程主机进行数据通信的 Socket。可以使用此返回的 Socket 来调用 Send 或 Receive 方法。如果要指定本地 IP 地址和端口号,请在调用 Listen 方法之前先调用 Bind 方法。如果不调用 Bind,基础服务提供程序将为您分配这些值。此后,可以使用 LocalEndPoint 属性来标识分配给 Socket 的 IP 地址和端口号。如果想连接到侦听主机,请调用 Connect 方法。若要进行数据通信,请调用 Send 或 Receive 方法。
如果当前使用的是无连接协议(如 UDP),则根本不需要侦听连接。调用 ReceiveFrom 方法可接受任何传入的数据报。使用 SendTo 方法可将数据报发送到远程主机。
若要在执行过程中使用单独的线程处理通信,请使用下面的方法,这些方法适用于异步操作模式。
如果当前使用的是面向连接的协议(如 TCP),则可使用 Socket、BeginConnect 和 EndConnect 方法来连接侦听主机。通过使用 BeginSend 和 EndSend 方法,或者使用 BeginReceive 和 EndReceive 方法,可以进行异步数据通信。可以使用 BeginAccept 和 EndAccept 处理传入的连接请求。
如果当前使用的是无连接协议(如 UDP),则可以使用 BeginSendTo 和 EndSendTo 来发送数据报,而使用 BeginReceiveFrom 和 EndReceiveFrom 来接收数据报。
当数据发送和数据接收完成之后,可使用 Shutdown 方法来禁用 Socket。在调用 Shutdown 之后,可调用 Close 方法来释放与 Socket 关联的所有资源。
Socket 类允许使用 SetSocketOption 方法来配置 Socket。可使用 GetSocketOption 方法来检索这些设置。
注意   如果编写较简单的应用程序,而且只需同步数据传输,则可以考虑使用 TcpClient、TcpListener 和 UdpClient。这些类为 Socket 通信提供了更简单、对用户更友好的接口。
示例
[Visual C#] 下面的示例显示如何使用 Socket 类向 HTTP 服务器发送数据和接收响应。

using System;
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;

public class mySocket
{
   private static Socket connectSocket(string server, int port)
   {
      Socket s = null;
      IPHostEntry iphe = null;
   
   
    try
      {
        // Get host related information.
      iphe = Dns.Resolve(server);
   
   
      // Loop through the AddressList to obtain the supported AddressFamily. This is to avoid
      // an exception to be thrown if the host IP Address is not compatible with the address family
      // (typical in the IPv6 case).
        foreach(IPAddress ipad in iphe.AddressList)
        {
            IPEndPoint ipe = new IPEndPoint(ipad, port);

            Socket tmpS =
              new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

          tmpS.Connect(ipe);

        if(tmpS.Connected)
            {
              s = tmpS;
              break;
            }
            else
              continue;
        }
      }
   
      catch(SocketException e)
      {
          Console.WriteLine("SocketException caught!!!");
          Console.WriteLine("Source : " + e.Source);
          Console.WriteLine("Message : " + e.Message);
      }
      catch(Exception e)
      {
          Console.WriteLine("Exception caught!!!");
          Console.WriteLine("Source : " + e.Source);
          Console.WriteLine("Message : " + e.Message);
      }
      return s;

    }


  // This method requests the home page content for the passed server.
  // It displays the number of bytes received and the page content.
  private static string socketSendReceive(string server, int port)
    {
      //Set up variables and String to write to the server.
      Encoding ASCII = Encoding.ASCII;
      string Get = "GET / HTTP/1.1/r/nHost: " + server +
                 "/r/nConnection: Close/r/n/r/n";
      Byte[] ByteGet = ASCII.GetBytes(Get);
      Byte[] RecvBytes = new Byte[256];
      String strRetPage = null;

      // Create a socket connection with the specified server and port.
      Socket s = connectSocket(server, port);

      if (s == null)
        return ("Connection failed");
     
      // Send request to the server.
      s.Send(ByteGet, ByteGet.Length, 0); 
       
   
      // Receive the server  home page content.
      Int32 bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);

   
  
      // Read the first 256 bytes.
      strRetPage = "Default HTML page on " + server + ":/r/n";
      strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, bytes);

   
      while (bytes > 0)
      {
        bytes = s.Receive(RecvBytes, RecvBytes.Length, 0);
        strRetPage = strRetPage + ASCII.GetString(RecvBytes, 0, bytes);
      }
          
      return strRetPage;
    }
   
    public static void Main(string[] args)
    {
      string host;
      int port = 80;

      if (args.Length == 0)
          // If no server name is passed as argument to this program, use the current
          // host name as default.
          host = Dns.GetHostName();
      else
          host = args[0];


      string result = socketSendReceive(host, port);
      
      Console.WriteLine(result);
   }
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值