嵌入式马邦德 2021-09-29 11:19 采纳率: 100%
浏览 79
已结题

c#socket异步通讯问题


public class AsyncTCP
    {
        readonly S7_telegrasm s7 = new S7_telegrasm();
        public Socket socket;
        /// <summary>
        /// 连接
        /// </summary>
        public void Connect(string ip, string port)
        {
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress IPA = IPAddress.Parse(ip);
            IPEndPoint iep = new IPEndPoint(IPA, int.Parse(port));
            socket.BeginConnect(iep, new AsyncCallback(ConnectCallbackj), socket);
            byte[] send;
            try
            {
                //cotp的发送接收
                send = s7.Cotp();
                socket.BeginSend(send, 0, send.Length, 0, new AsyncCallback(tellCallback), socket);  //建立连接时这里报错了
                Thread.Sleep(100);
                byte[] cotp = new byte[22];
                socket.BeginReceive(cotp, 0, cotp.Length, 0, new AsyncCallback(askCallback), socket);
                Thread.Sleep(100);

                //通信建立的发送接收
                send = s7.Comm();

                socket.BeginSend(send, 0, send.Length, 0, new AsyncCallback(tellCallback), socket);
                Thread.Sleep(100);
                byte[] S7comm = new byte[27];
                socket.BeginReceive(S7comm, 0, S7comm.Length, 0, new AsyncCallback(askCallback), socket);
                Thread.Sleep(100);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
}
        /// <summary>
        /// Connect回调函数
        /// </summary>
        void ConnectCallbackj(IAsyncResult iar)
        {
            try
            {
                Socket client = (Socket)iar.AsyncState;
                client.EndConnect(iar);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }
        private void askCallback(IAsyncResult iar)
        {
            try
            {
                Socket ask = (Socket)iar.AsyncState;
                int bytesSent = ask.EndSend(iar);
                Console.WriteLine("Sent {0} bytes to client.", bytesSent);
                ask.Shutdown(SocketShutdown.Both);
                ask.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
        private void tellCallback(IAsyncResult iar)
        {
            try
            {
                Socket tell = (Socket)iar.AsyncState;
                int bytesSent = tell.EndSend(iar);
                Console.WriteLine("Sent {0} bytes to client.", bytesSent);
                tell.Shutdown(SocketShutdown.Both);
                tell.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
        /// <summary>
        /// 发送数据
        /// </summary>
        public void Send(Socket handler, byte[] byteSend)
        { 
            handler.BeginSend(byteSend, 0, byteSend.Length, 0, new AsyncCallback(SendCallback), handler);
        }
        private void SendCallback(IAsyncResult iar)
        {
            try
            {
                Socket handler = (Socket)iar.AsyncState;
                int bytesSent = handler.EndSend(iar);
                Console.WriteLine("Sent {0} bytes to client.", bytesSent);
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
        /// <summary>
        /// 接收数据
        /// </summary>
        public void Receive(Socket client,byte[] byteRead)
        {
            try
            {
                if (byteRead.Length > 0)
                {   
                    client.BeginReceive(byteRead, 0, byteRead.Length, 0, new AsyncCallback(ReceiveCallback), client);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
        private void ReceiveCallback(IAsyncResult iar)
        {
            try
            {
                Socket handler = (Socket)iar.AsyncState;
                int bytesSent = handler.EndSend(iar);
                Console.WriteLine("Sent {0} bytes to client.", bytesSent);
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }

我本想建立连接时将两个报文发送过去,但是在报文发送哪里出了问题,连接上了,发不过去

img

  • 写回答

1条回答 默认 最新

  • wanghui0380 2021-09-29 14:23
    关注

    socket.BeginConnect(iep, new AsyncCallback(ConnectCallbackj), socket);
    byte[] send;
    原因连接后回调,才表示连接结果,所以如果按你的写法后续send应该写进回调处理部分,而不是放在这里,如果非要放在这里需要用个异步信号量去同步一下操作(异步信号量,等待异步回调成功后在进行send操作)

    当然我不明白你为啥不直接用 await socket.ConnAsync(),如果是这种写法,你现在的代码逻辑就OK

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月3日
  • 已采纳回答 11月25日
  • 创建了问题 9月29日

悬赏问题

  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示