未正确处理TCP套接字

时间:2015-09-01 20:12:52

标签: c# sockets tcp

我有一个静态方法

public class TelnetClient
{
    public static string SendAndReceiveData2(string data, string HostIPAddress, int Port)
    {
        using (Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
        {
            socket.Connect(HostIPAddress, Port);
            byte[] bytesToSend = Encoding.ASCII.GetBytes(data);
            socket.ReceiveTimeout = 3000;
            socket.SendTimeout = 3000;
            int bytesSent = socket.Send(bytesToSend);
            if (bytesSent != bytesToSend.Length)
            {
                throw new Exception("Invalid send byte number");
            }


            byte[] bytesReceiveBuffer = new byte[1024];
            int bytesRec = socket.Receive(bytesReceiveBuffer); //No need to loop for testing
            string returnedData = Encoding.ASCII.GetString(bytesReceiveBuffer, 0, bytesRec);

            socket.Close(); // Just out of desperation
            socket.Dispose();
            return returnedData;
        }
    }
 }

这就是我所说的:

for (int i = 0; i < 10; i++)
{
    TelnetClient.SendAndReceiveData2("some data different each time", "127.0.0.1", 1234);
}

我在循环中调用此方法。此方法将一些命令发送到第三方应用程序,该应用程序立即返回响应。问题是这个代码适用于第一次迭代,但在第二次迭代时,它在socket.Receive失败并出现错误:

  

连接尝试失败,因为连接方没有   在一段时间后,或已建立的连接正确响应   失败,因为连接的主机无法响应。

这是一个棘手的部分,如果不是多次循环,我关闭exe并通过命令提示符重新开始,我没有收到错误,第三方应用程序也收到多个请求好。

这让我相信某种程度上套接字没有在循环中正确处理。但如果我关闭流程并重新开始,则没有问题。

我已经检查过每次socket.LocalEndPoint指向不同的端口。第二次迭代时socket.Available也设置为0

我不确定发生了什么,并希望得到任何帮助。

2 个答案:

答案 0 :(得分:0)

我注意到你正在做一个Socket.Connect,但从未做过Socket.Disconnect。

从MSDN网站Socket.Disconnect将允许重用套接字并关闭连接。

答案 1 :(得分:0)

Socket和Socket处理没有任何问题。错误消息有点误导。问题发生在服务器端。

更多细节......

第二次迭代时发送的数据无效,当我尝试发送与第一次迭代完全相同的数据时,它也失败了,因为对于每个请求,服务器都需要一个唯一的Guid id。在循环外生成Guid因此它被用于迭代中的所有项目。重启过程正在运行,因为我会在第一次迭代时得到一个新的Guid