使用TCP协议发送报文

/// <summary>
        /// 发送数据
        /// </summary>
        /// <param name="xml"></param>
        private bool SendMessage(string xml,out string msg)
        {

            xml = (xml.Length + 6).ToString().PadLeft(6, '0') + xml;

            WriteLog("请求:" + xml);
            bool retb = false;

            string server = tbEqIP.Text.Trim();
            int port = Convert.ToInt32(tbEqPort.Text.Trim());

            System.Net.Sockets.TcpClient client = new System.Net.Sockets.TcpClient();
            System.Net.Sockets.NetworkStream stream = null;
            try
            {
                client.ReceiveTimeout = 60 * 1000;
                client.Connect(server, port);
                stream = client.GetStream();

                byte[] buf = Encoding.UTF8.GetBytes(xml);               
                //string encoding = edEncoding.Text.Trim();
                //Coder coder = new Coder(encoding);
                //byte[] buf = coder.GetEncodingBytes(xml);

                stream.Write(buf, 0, buf.Length);
                //string msgAll = string.Format("{0,10:d}{1:s}", buf.Length, xml);
                //byte[] bufAll = coder.GetEncodingBytes(msgAll);
                //stream.Write(bufAll, 0, bufAll.Length);
                stream.Flush();


                //if (checkBox1.Checked)
                //{
                    //byte[] buffer = new Byte[1024];
                    //int received = stream.Read(buffer, 0, 1024);
                byte[] buffer = new Byte[4096];
                int received = stream.Read(buffer, 0, 4096);
                if (received <= 0)
                {
                    msg = "数据读取失败";//读取失败
                    //throw new Exception("数据读取失败");
                }
                else
                {
                    msg = Encoding.UTF8.GetString(buffer).Replace("\0",null);
                    WriteLog("应答:" + msg);

                    //处理头部信息
                    int len = Convert.ToInt32(msg.Substring(0, 6));
                    if (len != msg.Length)
                    {
                        retb = false;
                        msg = "报文长度与实际长度不一致";
                    }
                    else
                    {
                        //去掉报文头
                        msg = msg.Substring(32);
                        retb = true;
                    }
                }
                    //retMsg = coder.GetEncodingString(buffer, received);
                //}

            }
            catch (Exception ex)
            {
                retb = false;
                msg = ex.Message;
            }
            finally
            {
                if (stream != null)
                    stream.Close();

                if (client.Connected)
                    client.Close();
            }

            return retb;
        }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的C语言实例,用于发送一个读取保持寄存器的Modbus-TCP协议报文: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define SERVER_IP "192.168.1.100" #define SERVER_PORT 502 int main(int argc, char *argv[]) { int sockfd, len, ret; struct sockaddr_in servaddr; char sendbuf[1024] = {0}; char recvbuf[1024] = {0}; // 创建socket sockfd = socket(AF_INET, SOCK_STREAM, 0); // 设置服务器地址及端口号 bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(SERVER_PORT); inet_pton(AF_INET, SERVER_IP, &servaddr.sin_addr); // 连接服务器 ret = connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)); if (ret < 0) { perror("connect error"); exit(1); } // 组装Modbus-TCP请求报文 uint16_t tid = 0x0001; // 事务标识符 uint16_t pid = 0x0000; // 协议标识符 uint16_t len = 0x0006; // 长度字段 uint8_t uid = 0x01; // 单元标识符 uint8_t func = 0x03; // 功能码 uint16_t addr = 0x0000; // 寄存器地址 uint16_t count = 0x0001;// 寄存器数量 memcpy(sendbuf, &tid, sizeof(tid)); memcpy(sendbuf+2, &pid, sizeof(pid)); memcpy(sendbuf+4, &len, sizeof(len)); memcpy(sendbuf+6, &uid, sizeof(uid)); memcpy(sendbuf+7, &func, sizeof(func)); memcpy(sendbuf+8, &addr, sizeof(addr)); memcpy(sendbuf+10, &count, sizeof(count)); // 发送请求报文 ret = send(sockfd, sendbuf, 12, 0); if (ret < 0) { perror("send error"); exit(1); } // 接收响应报文 ret = recv(sockfd, recvbuf, sizeof(recvbuf), 0); if (ret < 0) { perror("recv error"); exit(1); } // 解析响应报文 // ... // 关闭socket close(sockfd); return 0; } ``` 以上示例中,我们通过socket API创建一个TCP连接,并且设置服务器地址及端口号。然后,我们组装了一个读取保持寄存器的Modbus-TCP请求报文,并通过send API发送给服务器。最后,我们通过recv API接收服务器返回的响应报文,并进行解析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值