客户端套接字没有在.NET中获得响应字节

时间:2016-01-27 08:28:17

标签: c# sockets

我正在服务器套接字上创建并发送消息,而不是得到任何响应,我想知道可能的原因是什么。下面是我的客户端套接字示例代码

static void Main()
{
    int _DCPport = 9090;
    IPHostEntry ipHostInfo = Dns.GetHostEntry("HostName");
    Console.WriteLine("Got the IP Host Info" , ipHostInfo.ToString ());
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    Console.WriteLine("Got the IP hadress Info");

    //End point of the host where the socket will be connected
    IPEndPoint remoteDAPEndPoint = new IPEndPoint(ipAddress, _DCPport);

    // Create a clientSocket that connects to host
    Socket clientDAP = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    clientDAP.Connect(remoteDAPEndPoint);
    Console.WriteLine("Client socket connected to remote end point");

    #region Input variables
    string requestString = "Hello";
    string responseString = "";

    byte[] requestByte = System.Text.Encoding.UTF8.GetBytes(requestString);
    byte[] responseByte = new byte[1024];

    StringBuilder messageBuilder = new StringBuilder();
    int byteResult = 0;
    #endregion

    try
    {
        //sending the string as bytes over the socket
        Console.WriteLine("Sending the input " + requestString);
        clientDAP.Send(requestByte);
    }
    catch (SocketException eX)
    {

        Console.WriteLine(eX.Message);
    }

    try
    {
        //recieving the response bytes
        byteResult = clientDAP.Receive(responseByte, clientDAP.Available, SocketFlags.None);
        Console.WriteLine("Recieved {0} bytes as response from remote end point" , byteResult);
        if (clientDAP.Connected)
        {
            responseString = Encoding.UTF8.GetString(responseByte);
            messageBuilder.Append(responseString);
        }
    }
    catch (SocketException eX)
    {

        Console.WriteLine(eX.Message);
    }

    clientDAP.Shutdown(SocketShutdown.Both);
    clientDAP.Disconnect(true);


    string sResult = messageBuilder.ToString();
    Console.WriteLine(sResult);


}

当我调用socket.Recieve()时,我没有得到任何字节,为什么会出现这种情况的原因?

1 个答案:

答案 0 :(得分:1)

来自Socket.Send

  

也无法保证您发送的数据会立即显示在网络上。为了提高网络效率,底层系统可能会延迟传输,直到收集到大量的传出数据。成功完成Send方法意味着底层系统有空间缓冲数据以进行网络发送

这意味着当您对Send的通话完成后,数据可能还没有到达服务器。更不用说服务器有时间处理您的数据并返回响应。

然而,您的代码会直接收费以尝试接收服务器的响应。这本身并不合理。如果指定了缓冲区的大小,而不是使用Receive,如果还没有可用的数据,我们会很高兴地返回0。因此,您的Receive来电要求最多0个字节,并且要求您提供的数量。

所以改变这一行

byteResult = clientDAP.Receive(responseByte, 1024, SocketFlags.None);

(或者更好的是,引入一个常量和/或使用responseByte.Length或切换到一个重载,你没有明确指定你想要的字节数。