我正在服务器套接字上创建并发送消息,而不是得到任何响应,我想知道可能的原因是什么。下面是我的客户端套接字示例代码
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()时,我没有得到任何字节,为什么会出现这种情况的原因?
答案 0 :(得分:1)
来自Socket.Send
:
也无法保证您发送的数据会立即显示在网络上。为了提高网络效率,底层系统可能会延迟传输,直到收集到大量的传出数据。成功完成Send方法意味着底层系统有空间缓冲数据以进行网络发送
这意味着当您对Send
的通话完成后,数据可能还没有到达服务器。更不用说服务器有时间处理您的数据并返回响应。
然而,您的代码会直接收费以尝试接收服务器的响应。这本身并不合理。如果指定了缓冲区的大小,而不是使用Receive
,如果还没有可用的数据,我们会很高兴地返回0
。因此,您的Receive
来电要求最多0
个字节,并且要求您提供的数量。
所以改变这一行
byteResult = clientDAP.Receive(responseByte, 1024, SocketFlags.None);
(或者更好的是,引入一个常量和/或使用responseByte.Length
或切换到一个重载,你没有明确指定你想要的字节数。