有关套接字通信的问题

时间:2010-03-22 11:45:51

标签: c# sockets

我在VS.NET中有两个独立的套接字项目。其中一个是发件人,另一个是接收者。启动接收器后,我从发送者发送数据。尽管send方法在成功传输时返回13个字节,但接收器接收0(零)。接收方接受发送方套接字并监听它。但无法接收数据。为什么呢?

P.S。 :如果发送者代码放在接收器项目中,接收者也可以获取数据。

3 个答案:

答案 0 :(得分:1)

我认为问题在于发送应用程序在接收器可以读取数据之前结束。如果在Thread.Sleep(1000);调用之后放置Send,接收应用程序将读取数据(至少在我测试时)。

答案 1 :(得分:0)

很可能这是你的代码中的一个错误,但是没有看到代码就无法分辨。

但请注意,TCP / IP没有消息概念,只有数据流。所以它可以发送13个字节并在一次读取中接收6个,在下一个接收中接收7个字节。或者相反,发送13个字节然后再发送7个字节,并在接收端接收它们作为一个20字节的单个块。

答案 2 :(得分:0)

非常感谢你的兴趣。 这是代码:

/ ***********************************接收人********** ************ /

课程计划     {         static void Main(string [] args)         {             Receiver recv = new Receiver();             recv.Start();
        }     }

public class Receiver
{
    public void Start()
    {
        Socket gateSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        gateSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8999));
        gateSocket.Listen(12);

        Thread thGateListen = new Thread(new ParameterizedThreadStart(GateListener));
        thGateListen.Start(gateSocket);
    }

    public void GateListener(object obj)
    {

        Socket gateSocket = (Socket)obj;

        for (; ; )
        {
            Socket newRequest = gateSocket.Accept();
            Console.WriteLine("New Connection Request");
            Thread thReadData = new Thread(new ParameterizedThreadStart(ReadFromSocket));
            thReadData.Start(newRequest);
        }
    }


    public void ReadFromSocket(object obj)
    {
        Socket s = (Socket)obj;
        for (; ; )
        {
            if (s.Available > 0)
            {
                byte[] buffer = new byte[s.Available];
                s.Receive(buffer);
                Console.WriteLine(System.Text.Encoding.ASCII.GetString(buffer));
            }
        }
    }

}

/ *************************************发件人********** ************ /

课程计划     {         static void Main(string [] args)         {             发件人s =新发件人();             s.Send(“Hello Socket!”);         }     }

class Sender
{
    public void Send(string s)
    {
        Socket sendSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        sendSocket.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8999));

        sendSocket.Send(System.Text.Encoding.ASCII.GetBytes(s));
    }

}