• Socket Send and Receive [C#]


    Socket Send and Receive [C#]

    Socket Send and Receive [C#]

    This example shows how to send and receive data via TCP/IP using Socket in .NET Framework. There are methods Socket.Send and Socket.Receive.

    Socket.Send method

    Send method sends data from your buffer to a connected Socket. When you call the Send method it returns number of bytes which were „sent“. But it doesn't mean that the bytes were already received by the other side, it only means that the data were stored in a socket buffer and the socket will be trying to send them. If the socket buffer is full a WouldBlock error occurs. You should wait for a while a try to send the data again.

    Following method sends size bytes stored in the buffer from the offset position. If the operation lasts more than timeout milliseconds it throws an exception.

    [C#]

    public static void Send(Socket socket, byte[] buffer, int offset, int size, int timeout)
    {
      int startTickCount = Environment.TickCount;
      int sent = 0;  // how many bytes is already sent
      do {
        if (Environment.TickCount > startTickCount + timeout)
          throw new Exception("Timeout.");
        try {
          sent += socket.Send(buffer, offset + sent, size - sent, SocketFlags.None);
        }
        catch (SocketException ex)
        {
          if (ex.SocketErrorCode == SocketError.WouldBlock ||
              ex.SocketErrorCode == SocketError.IOPending ||
              ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
          {
            // socket buffer is probably full, wait and try again
            Thread.Sleep(30);
          }
          else
            throw ex;  // any serious error occurr
        }
      } while (sent < size);
    }
    
    

    To call the Send method use following code snippet (suppose the static Send method is defined in MyClass class). TCP/IP socket can be obtained using TcpClient class. Use TcpClient.Client property to get the underlying Socket (this property is public since .NET Framework 2.0).

    [C#]

    Socket socket = tcpClient.Client;
    string str = "Hello world!";
    try
    { // sends the text with timeout 10s
      MyClass.Send(socket, Encoding.UTF8.GetBytes(str), 0, str.Length, 10000);
    }
    catch (Exception ex) { /* ... */ }
    
    

    Socket.Receive method

    Receive method receives data from a bound Socket to your buffer. The method returns number of received bytes. If the socket buffer is empty a WouldBlock error occurs. You should try to receive the data later.

    Following method tries to receive size bytes into the buffer to the offset position. If the operation lasts more than timeout milliseconds it throws an exception.

    [C#]

    public static void Receive(Socket socket, byte[] buffer, int offset, int size, int timeout)
    {
      int startTickCount = Environment.TickCount;
      int received = 0;  // how many bytes is already received
      do {
        if (Environment.TickCount > startTickCount + timeout)
          throw new Exception("Timeout.");
        try {
          received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None);
        }
        catch (SocketException ex)
        {
          if (ex.SocketErrorCode == SocketError.WouldBlock ||
              ex.SocketErrorCode == SocketError.IOPending ||
              ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
          {
            // socket buffer is probably empty, wait and try again
            Thread.Sleep(30);
          }
          else
            throw ex;  // any serious error occurr
        }
      } while (received < size);
    }
    
    

    Call the Receive method using code such this:

    [C#]

    Socket socket = tcpClient.Client;
    byte[] buffer = new byte[12];  // length of the text "Hello world!"
    try
    { // receive data with timeout 10s
      MyClass.Receive(socket, buffer, 0, buffer.Length, 10000);
      string str = Encoding.UTF8.GetString(buffer, 0, buffer.Length);
    }
    catch (Exception ex) { /* ... */ }
    
    

    See also

      • Socket – MSDN – provides many methods for network communications
      • Socket.Send – MSDN – sends data to a socket
      • Socket.Receive – MSDN – receives data from a socket
      • SocketError – MSDN – enumeration with error codes for the Socket (WouldBlock)
      • TcpClient – MSDN – provides client connections for TCP
      • TcpClient.Client – MSDN – gets the underlying Socket
  • 相关阅读:
    python爬虫实例--爬取拉勾网
    面试时,如何回答你还有什么想要了解的?
    深入理解三次握手四次挥手以及使用scapy实现ddos雏形
    解决socket粘包的两种low版模式 os.popen()和struct模块
    浅谈osi模型 三次握手 四次挥手 ddos攻击原理
    渲染相关书籍
    unity 场景编辑器物体加图标
    音乐模拟器
    3d服装制作软件
    uv投影插值
  • 原文地址:https://www.cnblogs.com/zkwarrior/p/13173980.html
Copyright © 2020-2023  润新知