各位大虾!!小弟是个新手,最近学习Socket编程,遇到了一个问题:
主要代码如下:
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPHostEntry dns2 = Dns.GetHostEntry("hp-15ff12452e50");
            Console.WriteLine("现在正在连接到" + dns2.AddressList[0] + "的" + "4444号端口......");
            IPAddress add1 = IPAddress.Parse(args[0]);
            TcpListener tl = new TcpListener(add1, 4444);
            string send_data = "tarzan!";
            byte[] rec_byte = new byte[100];
            byte[] send_byte = Encoding.Default.GetBytes(send_data.ToCharArray());
            tl.Start();
            IPEndPoint host1 = new IPEndPoint(dns2.AddressList[0], 4444);
            Console.WriteLine(s.Connected);   
            s.Connect(host1);            
            Console.WriteLine(s.Connected);
            byte[] msg = Encoding.Default.GetBytes("This is a test");
            byte[] bytes = new byte[256];
            try
            {
                // Blocks until send returns.
                Console.WriteLine(Encoding.Default.GetString(msg));
                int i = s.Send(msg, msg.Length, SocketFlags.None);
                Console.WriteLine("Sent {0} bytes.", i.ToString());
                s.SendTimeout = 5000;
                // Get reply from the server.
                //if (s.Available != 0)
                //{
                s.ReceiveTimeout = 5000;
                    int byteCount = s.Receive(bytes, s.Available,
                       SocketFlags.None);
                    if (byteCount > 0)
                    {
                        Console.WriteLine(Encoding.Default.GetString(bytes));
                    }
                    s.Close();
                //}
            }
                   catch ( SocketException e ) 
                   {
                      Console.WriteLine( "{0} Error code: {1}.", e.Message, e.ErrorCode.ToString() );
                      
                   }
执行后,在命令行中报错为:
现在正在连接到10.10.0.1的4444号端口......
False
True
This is a test
Sent 14 bytes.
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond Error code: 10060.
为什么收不到数据,请指教,谢谢
我已经关了防火墙

解决方案 »

  1.   

    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPHostEntry dns2 = Dns.GetHostEntry("hp-15ff12452e50");
                Console.WriteLine("现在正在连接到" + dns2.AddressList[0] + "的" + "4444号端口......");
                IPAddress add1 = IPAddress.Parse(args[0]);
                TcpListener tl = new TcpListener(add1, 4444);
                string send_data = "tarzan!";
                byte[] rec_byte = new byte[100];
                byte[] send_byte = Encoding.Default.GetBytes(send_data.ToCharArray());
                tl.Start();
                IPEndPoint host1 = new IPEndPoint(dns2.AddressList[0], 4444);
                Console.WriteLine(s.Connected);   
                s.Connect(host1);            
                Console.WriteLine(s.Connected);            //
                //这里, Send出去的东西要添加回车
                //
                byte[] msg = Encoding.Default.GetBytes("This is a test\r\n\r\n\r\n");
                byte[] bytes = new byte[256];
                try
                {
                    // Blocks until send returns.
                    Console.WriteLine(Encoding.Default.GetString(msg));
                    int i = s.Send(msg, msg.Length, SocketFlags.None);
                    Console.WriteLine("Sent {0} bytes.", i.ToString());
                    s.SendTimeout = 5000;
                    // Get reply from the server.
                    //if (s.Available != 0)
                    //{
                    s.ReceiveTimeout = 5000;
                        int byteCount = s.Receive(bytes, s.Available,
                           SocketFlags.None);
                        if (byteCount > 0)
                        {
                            Console.WriteLine(Encoding.Default.GetString(bytes));
                        }
                        s.Close();
                    //}
                }
                       catch ( SocketException e ) 
                       {
                          Console.WriteLine( "{0} Error code: {1}.", e.Message, e.ErrorCode.ToString() );
                          
                       }
      

  2.   

    其实, 今天都已经叫你试试telnet过去的, 像这样telnet localhost 4444然后, 随便输入些什么, 它并没有response你啊, 你还得在输入完了后, 按下回车才行, 而且, 由于这不是你自定义的Server, 它要连续按两个回车才会有反应的, 所以才会有上面的solution
      

  3.   

    按照你说的做了,还是不行.
    telnet可以
    怎么办啊,郁闷啊
      

  4.   

    不会吧, 怎么会不行呢? 我在自己的机上都运行过啊要不你把那个TcpListener注释掉, 其实, 没明白你为什么要用那个TcpListener
      

  5.   

    LeoMaya:
    只修改("This is a test\r\n\r\n\r\n");\就可以吗?我试过了,没用啊,很长时间每有解决这个问题了,不爽!
      

  6.   

    LeoMaya:
    我这里 如果没有TcpListener,就会报错"目标主机积极拒绝"所以加上了
      

  7.   

    我test的时候没加TcpListener, 其他的code都照搬, test通过啊不过, 你得先确认, 你自己telnet localhost 4444然后连续几个回车看看有没有回应, 如果没有, 那就不是你的程序问题了
      

  8.   

    private void AppendText(string msg)
            {
                richTextBox1.AppendText(msg + "\r\n");
            }        private void button2_Click(object sender, EventArgs e)
            {
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPHostEntry dns2 = Dns.GetHostEntry("192.168.xx.xxx");
                AppendText("现在正在连接到" + dns2.AddressList[0] + "的" + "4444号端口......");
                IPAddress add1 = IPAddress.Parse("192.168.xx.xxx");
                //TcpListener tl = new TcpListener(add1, 4444);
                string send_data = "tarzan!";
                byte[] rec_byte = new byte[100];
                byte[] send_byte = Encoding.Default.GetBytes(send_data.ToCharArray());
                //tl.Start();
                IPEndPoint host1 = new IPEndPoint(dns2.AddressList[0], 4444);
                AppendText("Socket Status: " + s.Connected.ToString());
                s.Connect(host1);
                AppendText("Socket Status: " + s.Connected.ToString());            //
                //这里, Send出去的东西要添加回车
                //
                byte[] msg = Encoding.Default.GetBytes("This is a test\r\n\r\n");
                byte[] bytes = new byte[256];
                try
                {
                    // Blocks until send returns.
                    AppendText(Encoding.Default.GetString(msg));
                    int i = s.Send(msg, msg.Length, SocketFlags.None);
                    AppendText(string.Format("Sent {0} bytes.", i.ToString()));
                    s.SendTimeout = 5000;
                    // Get reply from the server.
                    //if (s.Available != 0)
                    //{
                    s.ReceiveTimeout = 5000;
                    int byteCount = s.Receive(bytes, s.Available,
                       SocketFlags.None);
                    if (byteCount > 0)
                    {
                        AppendText(Encoding.Default.GetString(bytes));
                    }
                    s.Close();
                    //}
                }
                catch (SocketException exx)
                {
                    AppendText(string.Format("{0} Error code: {1}.", exx.Message, exx.ErrorCode.ToString()));
                }
            }
    test result:
    现在正在连接到192.168.xx.xxx的4444号端口......
    Socket Status: False
    Socket Status: True
    This is a test
    Sent 18 bytes.
    HTTP/1.1 400 Bad Request
    Server: Microsoft-IIS/5.1
    Date: Fri, 10 Aug 2007 07:53:44 GMT
    Content-Type: text/html
    Content-Length: 87<html><head><title>Error</title></head><body>The parameter is incorrect. </body></html>
      

  9.   

    我是用控制台做的,我想也不是程序的问题.会不会是我什么服务没开啊?对了,可以用本机IP测试吗?我的程序如果不加s.ReceiveTimeout,就一直等待
    如:
    现在正在连接到192.168.xx.xxx的4444号端口......
    Socket Status: False
    Socket Status: True
    This is a test
    Sent 18 bytes.
    不按ctrl+c无法退出
      

  10.   

    其实我就是用本机IP测试的啦IIS设好了就OK
      

  11.   

    怎么设置啊?socket也要设置IIS吗?
      

  12.   

    我按照你说,把tcplistener注释掉,设置IIS.结果是:
    现在正在连接到10.10.0.1的4444号端口......
    True
    This is a testSent 20 bytes.
    HTTP/1.1 400 Bad Request
    Server: Microsoft-IIS/5.1
    Date: Sat, 11 Aug 2007 21:03:39 GMT
    Content-Type: text/html
    Content-Length: 87
    并没有显示内容啊,而且是Bad Request
    为什么啊?
      

  13.   

    HTTP/1.1 400 Bad Request
    Server: Microsoft-IIS/5.1
    Date: Sat, 11 Aug 2007 21:03:39 GMT
    Content-Type: text/html
    Content-Length: 87这就是Socket回应的内容啊, 它不是什么Server, 当然不会按照什么格式给你回应信息了, 能收到就是连接成功