可不可以在一个Socket中先发发送数据,然后再读取数据?
程序如下:
using System.Text;
using System.IO;
using System.Net;
using System.Net.Sockets;namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Net.Sockets.Socket skServer;
            skServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            skServer.Connect("127.0.0.1", 9002);
            SendReceiveTest1(skServer);
            Console.ReadKey(false);
        }        public static int SendReceiveTest1(Socket server)
        {
            byte[] msg = Encoding.UTF8.GetBytes("This is a test");
            byte[] bytes = new byte[256];
            try
            {
                // Blocks until send returns.
                int i = server.Send(msg);
                Console.WriteLine("Sent {0} bytes.", i);                // Get reply from the server.
                i = server.Receive(bytes);
                Console.WriteLine(Encoding.UTF8.GetString(bytes));
            }
            catch (SocketException e)
            {
                Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
                return (e.ErrorCode);
            }
            return 0;
        }    }
}其中SendReceiveTest1是MSDN的中示例代码。
但是在skServer.Connect("127.0.0.1", 9002);处出错,
提示:由于目标机器积极拒绝,无法连接。Error Code:10061
将端口号改为80就可以了。但是下面在i = server.Receive(bytes);处又出错,
提示:远程主机强迫关闭了一个现有的连接。Error Code:10054
可是这是MSDN的示例啊,难道错了?求解这两个错误。
再问可不可以在一个Socket中先发发送数据,然后再读取数据?
最后如何改正确上面的程序?

解决方案 »

  1.   

    但是在skServer.Connect( "127.0.0.1 ",   9002);处出错, 
    提示:由于目标机器积极拒绝,无法连接。Error   Code:10061 
    机器的9002端口是否在监听?
    将端口号改为80就可以了。
    这是因为缺省的80端口处在监听状态
    但是下面在i   =   server.Receive(bytes);处又出错, 
    提示:远程主机强迫关闭了一个现有的连接。Error   Code:10054 
    这句是接收从服务器返回的信息,但是80端口没有写程序返回数据,当然出错了可是这是MSDN的示例啊,难道错了?
    还有一段呢?为说明你只运行一段,收发是两个程序的,好好看看MSDN
      

  2.   

    1。看看接收端的代码吧。估计在那里有错误。就像你服务端监听的端口是80而你写的连接端却是9002。
    2。可以
    3。在发送结束后,最好skServer.Shutdown(SocketShutdown.Both);
      

  3.   

    to:netfound 由于刚刚接触Socket。对其一无所知,所以提示的错误都不明白真正的含义,不知道问题产生的原因和解决的办法。所以才提问to:wangsaokui :谢谢指教。不过我这个就是个收发程序,有发送也有接收,
                         int   i   =   server.Send(msg); 这句不是发送吗?
    to:Koala_sea ;谢谢,不过这个例子就是先发送后接收的程序啊。
                        真的可以吗?我反复试了很久。还是没有办法。Shutdown这个好像没什么影响这个是我修改后的程序,没有问题了。
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Net;
    using System.Net.Sockets;namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                try
                {
                    IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),5000);
                    Socket skServer,skClient;   //服务端侦听Socket,客户端发送Socket
                    skServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    skServer.Bind(ipPoint);
                    skServer.Listen(5);
                    skClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    skClient.Connect(ipPoint);
                    Socket skReceive = skServer.Accept();   //侦听Socket的接收Socket
                    SendTest(skClient);
                    ReceiveTest(skReceive);
                    SendTest(skClient);
                    ReceiveTest(skReceive);
                    SendTest(skClient);
                    ReceiveTest(skReceive);
                }
                catch (SocketException ex) { Console.WriteLine("{0} Error code: {1}.", ex.Message, ex.ErrorCode); }
                Console.ReadKey(false);
            }        public static void SendTest(Socket skExec)
            {
                byte[] msg = Encoding.Default.GetBytes("Send a testdata!");
                try
                {
                    int i = skExec.Send(msg);
                    Console.WriteLine("Sent {0} bytes:Send a testdata!", i);
                }
                catch (SocketException ex) 
                { 
                    Console.WriteLine("{0} Error code: {1}.", ex.Message, ex.ErrorCode); 
                }
            }
            static void ReceiveTest(Socket skExec)
            {
                byte[] bytes = new byte[256];
                try
                {
                    int i = skExec.Receive(bytes);
                    Console.WriteLine("Receive data:" + Encoding.Default.GetString(bytes));
                }
                catch (SocketException ex)
                {
                    Console.WriteLine("{0} Error code: {1}.", ex.Message, ex.ErrorCode);
                }
            }
            static public int SendReceiveTest1(Socket server)
            {
                byte[] msg = Encoding.UTF8.GetBytes("This is a test");
                byte[] bytes = new byte[256];
                try
                {
                    // Blocks until send returns.
                    int i = server.Send(msg);
                    Console.WriteLine("Sent {0} bytes.", i);                // Get reply from the server.
                    i = server.Receive(bytes);
                    Console.WriteLine(Encoding.UTF8.GetString(bytes));
                }
                catch (SocketException e)
                {
                    Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
                    return (e.ErrorCode);
                }
                return 0;
            }    }
    }我发现还是没有办法在一个Socket实例中接收自己发送的数据。只能用两个Socket,共用一个IP:端口
      

  4.   

    你机子没打开9002端开监听,你可以加一段
    IPEndPoint   ipPoint   =   new   IPEndPoint(IPAddress.Parse("127.0.0.1"),9002); 
    Socket   skServer,skClient;       //服务端侦听Socket,客户端发送Socket 
    skServer   =   new   Socket(AddressFamily.InterNetwork,   SocketType.Stream, ProtocolType.Tcp); 
     skServer.Bind(ipPoint); 
     skServer.Listen(5);
    代码,再尝试连接就可能连上了,发送数据,接收数据我不写了
      

  5.   

    我专注的Web开发,对Socket的开发也不是很熟悉,但从你程序看得出来,9002端口没开。也就是服务器端没有监听9002。我想现在你也应该解决这个问题了。