套接字无法从服务器接收消息
Sockets not able to receive message from the server
我正在尝试使用套接字连接到应用程序。
应用程序使用端口 6100 进行通信。
我可以向应用程序发送消息,但无法接收任何消息。
这是我的代码,如果我做错了什么请告诉我。
public void Connect2(string host, int port, string cmd)
{
byte[] bytes = new byte[10024];
IPAddress[] IPs = Dns.GetHostAddresses(host);
Socket s = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
s.SendTimeout = 100;
Console.WriteLine("Establishing Connection to {0}",
host);
try
{
s.Connect(IPs[0], port);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
byte[] sendBites = System.Text.Encoding.ASCII.GetBytes(cmd);
int bytesSent = s.Send(sendBites);
int bytesRec = s.Receive(bytes);
s.ReceiveFrom(bytes, ref tmpRemote);
MessageBox.Show(s.ReceiveBufferSize.ToString());
MessageBox.Show(Encoding.ASCII.GetString(bytes, 0, bytesRec));
s.Shutdown(SocketShutdown.Both);
s.Close();
}
首先,当连接失败时,您仍在尝试 send/receive 数据。将发送和接收放在 try/catch.
中
我看到你调用了两次接收:
int bytesRec = s.Receive(bytes);
s.ReceiveFrom(bytes, ref tmpRemote);
可能发生的情况是:
- 您正在发送命令
- 您正在等待响应“int bytesRec = s.Receive(bytes);”
- 那么你又在等待更多数据.. "s.ReceiveFrom(bytes, ref tmpRemote);"
但是服务器可能不会发送额外的数据,所以你在等待"forever"
再次尝试删除 s.ReceiveFrom(bytes, ref tmpRemote);
Socket.ReceiveFrom()
通常用于接收UDP广播。
这段代码工作正常。
public string SocketSendReceive(string server, int port, string cmd)
{
byte[] recvBuffer = new byte[1024];
string host = "127.0.0.1";
TcpClient tcpClient = new TcpClient();
try
{
tcpClient.Connect(host, 6100);
}
catch (SocketException /*e*/)
{
tcpClient = null;
}
if (tcpClient != null && tcpClient.Connected)
{
tcpClient.Client.Send(Encoding.UTF8.GetBytes(cmd));
tcpClient.Client.Receive(recvBuffer);
// port = Convert.ToInt16(Encoding.UTF8.GetString(recvBuffer).Substring(2));
tcpClient.Close();
}
return Encoding.ASCII.GetString(recvBuffer, 0, recvBuffer.Length);
}
我正在尝试使用套接字连接到应用程序。
应用程序使用端口 6100 进行通信。 我可以向应用程序发送消息,但无法接收任何消息。
这是我的代码,如果我做错了什么请告诉我。
public void Connect2(string host, int port, string cmd)
{
byte[] bytes = new byte[10024];
IPAddress[] IPs = Dns.GetHostAddresses(host);
Socket s = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
s.SendTimeout = 100;
Console.WriteLine("Establishing Connection to {0}",
host);
try
{
s.Connect(IPs[0], port);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
byte[] sendBites = System.Text.Encoding.ASCII.GetBytes(cmd);
int bytesSent = s.Send(sendBites);
int bytesRec = s.Receive(bytes);
s.ReceiveFrom(bytes, ref tmpRemote);
MessageBox.Show(s.ReceiveBufferSize.ToString());
MessageBox.Show(Encoding.ASCII.GetString(bytes, 0, bytesRec));
s.Shutdown(SocketShutdown.Both);
s.Close();
}
首先,当连接失败时,您仍在尝试 send/receive 数据。将发送和接收放在 try/catch.
中我看到你调用了两次接收:
int bytesRec = s.Receive(bytes);
s.ReceiveFrom(bytes, ref tmpRemote);
可能发生的情况是:
- 您正在发送命令
- 您正在等待响应“int bytesRec = s.Receive(bytes);”
- 那么你又在等待更多数据.. "s.ReceiveFrom(bytes, ref tmpRemote);"
但是服务器可能不会发送额外的数据,所以你在等待"forever"
再次尝试删除 s.ReceiveFrom(bytes, ref tmpRemote);
Socket.ReceiveFrom()
通常用于接收UDP广播。
这段代码工作正常。
public string SocketSendReceive(string server, int port, string cmd)
{
byte[] recvBuffer = new byte[1024];
string host = "127.0.0.1";
TcpClient tcpClient = new TcpClient();
try
{
tcpClient.Connect(host, 6100);
}
catch (SocketException /*e*/)
{
tcpClient = null;
}
if (tcpClient != null && tcpClient.Connected)
{
tcpClient.Client.Send(Encoding.UTF8.GetBytes(cmd));
tcpClient.Client.Receive(recvBuffer);
// port = Convert.ToInt16(Encoding.UTF8.GetString(recvBuffer).Substring(2));
tcpClient.Close();
}
return Encoding.ASCII.GetString(recvBuffer, 0, recvBuffer.Length);
}