【问题标题】:Asynchronous sockets in ring transfer环传输中的异步套接字
【发布时间】:2015-05-13 05:15:25
【问题描述】:

我尝试编写程序,将多台机器组合成环。之后,我在这个戒指周围发送令牌。我有一个问题:当标记已经绕过环一次并且我想第二次发送它时,机器不想接受它标记。有时VS会出现异常,有点像“......主机强行关闭连接”。在使用异步套接字时没有出现这个问题之前...... 我想,侦听套接字中的那个问题,解决了 1 次并关闭。但是我该如何解决呢? 在此先感谢您的帮助。 初始化机器的函数:

private void connectButton_Click(object sender, EventArgs e)
    {
        if (!connected)
        {
            //some operation
        }
        else 
        {
            //some operation
        }
        try
        {
            sendS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            recieveS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            portFrom = int.Parse(port1TextBox.Text);
            portTo = int.Parse(port2TextBox.Text);
        }
        catch (Exception)
        {
            port1TextBox.Text = "Incorrect!";
        }

        IPAddress ipAddressFrom = IPAddress.Parse("192.168.1.122");
        IPEndPoint ipEnd = new IPEndPoint(ipAddressFrom, portFrom); //IPAddress.Any

        sendS.Bind(ipEnd);
        sendS.Listen(1);
        sendS.BeginAccept(new AsyncCallback(accept), null);
    }
    public void accept(IAsyncResult asyn)
    {
        Socket sock = sendS.EndAccept(asyn);
        // Let the worker Socket do the further processing for the just connected client
        begin(sock);

        // Since the main Socket is now free, it can go back and wait for
        // other clients who are attempting to connect
        sendS.BeginAccept(new AsyncCallback(accept), null);
    }

    public class SocketPacket
    {
        public Socket m_currentSocket;
        public byte[] dataBuffer;

        // Constructor that takes one argument. 
        public SocketPacket(int size)
        {
            dataBuffer = new byte[size];
        }
    }

    public void begin(Socket s)
    {
        AsyncCallback pfnWorkerCallBack = new AsyncCallback(serialPort1_DataReceived);
        SocketPacket theSocPkt = new SocketPacket(15);
        theSocPkt.m_currentSocket = s;
        s.BeginReceive(theSocPkt.dataBuffer, 0, theSocPkt.dataBuffer.Length, SocketFlags.None, pfnWorkerCallBack, theSocPkt);
    }

    private void serialPort1_DataReceived(IAsyncResult asyn)
    {
        SocketPacket socketData = (SocketPacket)asyn.AsyncState;
        int iRx = socketData.m_currentSocket.EndReceive(asyn);
        byte[] dataBytes = socketData.dataBuffer.ToArray();
        for (int i = dataBytes.Length - 1; i > 0; i--)
        {
            if (dataBytes[i] != 0)
            {
                Array.Resize(ref dataBytes, i+1);
                break;
            }
        }

        Encoding enc = Encoding.GetEncoding(1251);
        String text = enc.GetString(dataBytes);
        analyze(text);            
    }

功能,连接2台机器:

    private void button1_Click(object sender, EventArgs e)
    {
        if (connected)
        {
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse(ipTo.Text), System.Convert.ToInt32(portTo));
            recieveS.Connect(ip);
        }
    }

【问题讨论】:

    标签: sockets asynchronous


    【解决方案1】:

    好的。解决了。我忘了字符串

    begin(socketData.m_currentSocket);
    

    最后serialPort1_DataReceived函数...

    【讨论】:

      猜你喜欢
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-25
      • 1970-01-01
      相关资源
      最近更新 更多