当前位置:编程学习 > C#/ASP.NET >>

CSDN论坛 第8期专家问答——C#开发答疑

--------------------编程问答--------------------  艾马,难道是沙发? --------------------编程问答-------------------- --------------------编程问答-------------------- 谢谢分享了,呵呵 --------------------编程问答-------------------- 凉席准备好了。 --------------------编程问答-------------------- 支持一下,。。。。 --------------------编程问答-------------------- 要求上图。
--------------------编程问答-------------------- 杂志不错啊,希望能有 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 要求上图都是傻瓜。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- --------------------编程问答-------------------- OK,我来提第一个问题:
C#  Asp.net问题
======================================================
aspx页面:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Demo</title>
</head>
<body>
   <%AjaxFun("id",  delegate(){ %>
    <div id="test">
        <%=DateTime.Now.ToString("yyyy-MM-dd HH:mm") %>
    </div>
    <%}); %>
    
</body>
</html>


 public void AjaxFun(string id, ResponseDelegate fn)
    { 
        //这里如何只获取aspx 方法内部的html,也就是如何获取fn方法体html内容
    }

    public delegate void ResponseDelegate();
--------------------编程问答-------------------- 我占到位置了
--------------------编程问答--------------------
引用 11 楼 u011224502 的回复:
要求上图都是傻瓜。
你说哥是傻瓜 不想混啦?限你5分钟之内问出3道难题,不然你就shi定了! --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 艾玛,怎么没图,围观 --------------------编程问答-------------------- 支持一下!!!! --------------------编程问答-------------------- 问一哈 c# 比之php java 有哪些优势 那些缺点???

--------------------编程问答-------------------- 怎么通过代码提升应用程序的安全策略?我有一个Windows服务程序和若干个不同应用类型的Windows客户端,都同时运行在本机,它们之间想通过内存共享进行信息交换,其中Windows服务的运行用户是LocalSystem,它负责创建一个MemoryMappedFile,客户端打开该MemoryMappedFile与服务器及其它客户端进行信息交换。

但随后发现客户端总是无法打开服务器创建的MemoryMappedFile,当我把这个Windows服务的代码复制出来做成一个Windows程序后,我的客户端就可以成功打开,反之也可以(即我把客户端改成一个LocalSystem的服务用于测试,就可以打开成功),我怀疑这是因为Windows服务MemoryMappedFile资源是由LocalSystem创建的,而普通Windows应用程序不具有LocalSystem的安全权限导致的,所以我的Windows客户应该怎么通过代码来提升应用程序的安全策略,使之能访问LocalSystem所创建的MemoryMappedFile? --------------------编程问答-------------------- 做java的路过。。 --------------------编程问答-------------------- 学好C#可以从事哪方面的工作? --------------------编程问答-------------------- 学好C#可以从事哪方面的工作? --------------------编程问答--------------------
引用 22 楼 darkangeltear 的回复:
做java的路过。。


C#和JAVA谁更有前途?

--------------------编程问答--------------------
引用 23 楼 z8323664 的回复:
学好C#可以从事哪方面的工作?


引用 24 楼 u011225117 的回复:
学好C#可以从事哪方面的工作?


可以从事Android方面的工作 

--------------------编程问答-------------------- 你奇怪也
像小caoMVP这么铁杆的CSDN粉,竟然使用SINA的微博,为什么不用CSDN的呢

--------------------编程问答-------------------- --------------------编程问答-------------------- 您好,我想问一个关于Winform的。先看第一张图:
点上面右下角的“工具箱”就会弹出下面的浮层一样的窗体:如图:
而且这个浮层的窗体会随着主窗体一起动。希望专家可以指点一二,如何实现类似于浮层一样的窗体弹出。谢谢专家了。
祝专家生活顺心,工作如意。也谢谢CSDN提供这个平台。 --------------------编程问答-------------------- 不错,顶一下!! --------------------编程问答-------------------- 不爆张曹版主的照吗0.0 --------------------编程问答-------------------- 顶一下楼主,很好 --------------------编程问答-------------------- 有没有 什么工具 能够 检测 C#程序在运行(调试)过程中是否内存泄露(VS2010)?? --------------------编程问答--------------------
引用 14 楼 tiancaolin 的回复:
OK,我来提第一个问题:
C#  Asp.net问题
======================================================
aspx页面:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Demo</title>
</head>
<body>
   <%AjaxFun("id",  delegate(){ %>
    <div id="test">
        <%=DateTime.Now.ToString("yyyy-MM-dd HH:mm") %>
    </div>
    <%}); %>
    
</body>
</html>


 public void AjaxFun(string id, ResponseDelegate fn)
    { 
        //这里如何只获取aspx 方法内部的html,也就是如何获取fn方法体html内容
    }

    public delegate void ResponseDelegate();


引用 14 楼 tiancaolin 的回复:
OK,我来提第一个问题:
C#  Asp.net问题
======================================================
aspx页面:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Demo</title>
</head>
<body>
   <%AjaxFun("id",  delegate(){ %>
    <div id="test">
        <%=DateTime.Now.ToString("yyyy-MM-dd HH:mm") %>
    </div>
    <%}); %>
    
</body>
</html>


 public void AjaxFun(string id, ResponseDelegate fn)
    { 
        //这里如何只获取aspx 方法内部的html,也就是如何获取fn方法体html内容
    }

    public delegate void ResponseDelegate();


委托获取自身方法体内的内容不行吧?

我看可以这样搞

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Demo</title>
</head>
<body>
   <%AjaxFun("id",  delegate(){ %>
   <div id="getvalue">
    <div id="test">
        <%=DateTime.Now.ToString("yyyy-MM-dd HH:mm") %>
    </div>  
    </div>
    <script>
        alert(document.getElementById("getvalue").innerHTML);
    </script>
    <%}); %>
</body>
</html>




 public void AjaxFun(string id, ResponseDelegate fn)
    {

         fn.Invoke();
        //这里如何只获取aspx 方法内部的html,也就是如何获取fn方法体html内容
    }

    public delegate void ResponseDelegate();

--------------------编程问答-------------------- 除 --------------------编程问答-------------------- 我也来凑个热闹。
请问专家,ComboBox或DateTimePicker的弹出(下拉)窗口实现的原理是什么,主要有哪些关键技术,我想自己山塞一个。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- --------------------编程问答-------------------- 全是牛X人物,学生来看看 --------------------编程问答-------------------- 我有个问题。。能不能确定一个提问的主题范围再说? --------------------编程问答-------------------- --------------------编程问答-------------------- 我也问个。比较傻,不要笑
-----------------------------
asp.net程序中
连接mssql 的用户权限应该怎么设置,
我不是说:安全-用户名-新建。。。
是想问下,付给他那些权限最好。
判断的标准是什么
-----------------------------
最后谢谢斑竹回答
祝福斑竹 --------------------编程问答-------------------- 这个我也想学习一下 --------------------编程问答-------------------- 怎么学好C#?工作了 有时需要用 但基础薄弱 想知道怎么能踏实的掌握C#?  --------------------编程问答-------------------- 赶紧顶个,求份杂志 --------------------编程问答-------------------- 这场面,不混个脸熟就亏大发了 --------------------编程问答-------------------- 啦啦啦  --------------------编程问答-------------------- 我还在学习中,想问下大家,做一个项目的话,应该怎么去分析出这个项目具体有哪些类,每个类都有哪些属性和方法,最近表示刚学完OOP这块,表示一分析类这些的就好纠结,希望大家能给点好的建议,谢谢. --------------------编程问答-------------------- 新手过来凑个热闹顺便问些问题。
1、内存泄露
在开发过程中,经常与数据库交互,前段时间在开发时,不断的调试过程中突然发现程序运行的越来越慢,打开任务管理器,发现内存飙到90%+,因为之前有看到挺多关于内存泄露的问题,so,第一反应就是发生内存泄露了~,结果找资料,然后查代码找问题, 找了老久了~~(后来发现问题是在MSSQL上),这里想问问如何尽量避免和寻找  关于内存泄露的问题。
2、关于服务器控件
这样的,前段时间我在做ASP.NET开发过程当中有使用了一些服务器控件去做开发,因为服务器控件很大程度上加快了开发的效率。后来交流的时候,公司里面一个前辈说 建议我尽量少用 甚至不用服务器控件,说是服务器控件会频繁的和后台交互,导致程序占用大量的资源, 目前我已经没有再用服务器控件做开发,但还是不明白根结的原因。想问问这个服务器控件到底哪里占了那么多资源,难道真的就一无是处了么。。


还有些技术的东西自己想研究但还没去仔细了解的~~  就不问了~~ 也不好意思问  呵呵

再弱弱的问下    收徒弟么~~  
--------------------编程问答--------------------
引用 34 楼 a67251026 的回复:
Quote: 引用 14 楼 tiancaolin 的回复:

OK,我来提第一个问题:
C#  Asp.net问题
======================================================
aspx页面:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Demo</title>
</head>
<body>
   <%AjaxFun("id",  delegate(){ %>
    <div id="test">
        <%=DateTime.Now.ToString("yyyy-MM-dd HH:mm") %>
    </div>
    <%}); %>
    
</body>
</html>


 public void AjaxFun(string id, ResponseDelegate fn)
    { 
        //这里如何只获取aspx 方法内部的html,也就是如何获取fn方法体html内容
    }

    public delegate void ResponseDelegate();


引用 14 楼 tiancaolin 的回复:
OK,我来提第一个问题:
C#  Asp.net问题
======================================================
aspx页面:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Demo</title>
</head>
<body>
   <%AjaxFun("id",  delegate(){ %>
    <div id="test">
        <%=DateTime.Now.ToString("yyyy-MM-dd HH:mm") %>
    </div>
    <%}); %>
    
</body>
</html>


 public void AjaxFun(string id, ResponseDelegate fn)
    { 
        //这里如何只获取aspx 方法内部的html,也就是如何获取fn方法体html内容
    }

    public delegate void ResponseDelegate();


委托获取自身方法体内的内容不行吧?

我看可以这样搞

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Demo</title>
</head>
<body>
   <%AjaxFun("id",  delegate(){ %>
   <div id="getvalue">
    <div id="test">
        <%=DateTime.Now.ToString("yyyy-MM-dd HH:mm") %>
    </div>  
    </div>
    <script>
        alert(document.getElementById("getvalue").innerHTML);
    </script>
    <%}); %>
</body>
</html>




 public void AjaxFun(string id, ResponseDelegate fn)
    {

         fn.Invoke();
        //这里如何只获取aspx 方法内部的html,也就是如何获取fn方法体html内容
    }

    public delegate void ResponseDelegate();

能不能用 innerHTML去获取额~~ --------------------编程问答--------------------
能不能在有基础之上来点提高asp的资料或者方法! --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 想请教下,winfrm程序在退出后如何释放程序的内存。 --------------------编程问答-------------------- 前排刘明   


可是我找不到啥问题。 --------------------编程问答-------------------- 关于asp.net中的ip投票的问题!(限定ip)

它是将电脑的ip地址存在本地的cookie当中,如果删除cookie了,那么不就又可以重新投票了吗?

而且的话,我们这里用铁通的话,是没有固定ip的,那这样说,每次我重启电脑,就会用不一样的ip了,这样不是又可以进行多次投票了吗?

所以请教,具体投票的操作! --------------------编程问答-------------------- 问题一:下面一段简单代码中,GridView 等控件分页显示数据。

1、运行到代码中标示的地方,全部数据是不是都已填充到 DataSet?

2、如果是这样,象本论坛,每页显示 50 条主贴标题,共 1459 页,用户每点一下页码,就要全部查询填充一次,效率也太低了吧?本坛是怎么处理的?极其期待您的讲解。

3、如是不是这样,那么他的运行机制能否约略讲一下?是不是执行 GridView.DataBind()时才填充 DataSet?这也太不好理解了。

4、另外,本问题中的一个小问题,代码中:“//到了这里,数据连接是否已自动关闭?SqlDataAdapter、DataSet 是否已释放?”

    private void gvBind()
    {
        SqlConnection myConn = GetConnection();
        myConn.Open();
        string str = "select * from tb_user";
        SqlDataAdapter myDa = new SqlDataAdapter(str, myConn);
        DataSet myDs = new DataSet();
        myDa.Fill(myDs);  //运行到这里,全部数据是不是都已填充到 DataSet?
        this.GridView1.DataSource = myDs;
        this.GridView1.DataBind();  //是不是到这里才根据页数的设置填充数据?这个不太好理解了。
    }
    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GridView1.PageIndex = e.NewPageIndex;
        gvBind();
        //到了这里,绑定结束后,数据连接是否已自动关闭?SqlDataAdapter、DataSet 是否已释放?
    }


问题二:疯狂百度本坛问过,都没找到我想要的,这里再请教,关于下面代码中事务处理的方式。

1、循环体中,每循环一次,更改或插入数据表一条记录,如果循环上万次以后,每循环都挂起等待最后处理,事务对资源的消耗是否极大?会不会影响回滚?

2、如果对资源的占用没什么质的区别,那么事务处理是否也是采用类似临时表的操作?这样的话,无论循环多少次都不用担心了。

3、这种事务处理方法有没有问题?可以改进么?

    using (TransactionScope Ts = new TransactionScope())
    {
        while (条件)
        {
            //每循环一次,更改或插入数据表一条记录。
        } 
        Ts.Complete();
    }
--------------------编程问答-------------------- 全身心路过,真诚求杂志。 --------------------编程问答-------------------- 真心不错。。。赞一个 --------------------编程问答-------------------- 刚工作的菜鸟也有个问题,
项目里面很多类似报表的数据要显示出来,
用的是repeater绑定传过来的的DataTable,
感觉这样的数据处理方式很恶心,一旦修改就是从数据库一直改到web页面前台,
而且绑定的时候使用 “FiledName”的弱类型方式,也很不爽。
如果传List<OBJ> 倒是强类型了,但又不好控制样式,而且数据很多都是使用的联表查询,所以也不可能为所有的DataRow写ToObj方法(貌似 DDD 可以缓解这种方法?但现在也不可能做这种大手术了)。
相信这种困扰也是很多菜鸟会遇到的,想请教下,应该怎么改进,从什么方面入手改进呢?
--------------------编程问答-------------------- 大哥好,我是刚毕业不久的小弟,我也想问个问题,现在公司从asp.net转向了php,说PHP是趋势,大网站逐渐走向开源的方向,这是否意味着应该放弃asp.net(C#)投向PHP的怀抱呢?不知道您的建议和想法是? --------------------编程问答-------------------- --------------------编程问答--------------------
引用 65 楼 amwlgywxf 的回复:
大哥好,我是刚毕业不久的小弟,我也想问个问题,现在公司从asp.net转向了php,说PHP是趋势,大网站逐渐走向开源的方向,这是否意味着应该放弃asp.net(C#)投向PHP的怀抱呢?不知道您的建议和想法是?


你是来踢版的
--------------------编程问答-------------------- c# 水晶报表CrystalReport1.rpt第一次打开慢、第二次以后就快了得问题 求解?
--------------------编程问答--------------------
引用 65 楼 amwlgywxf 的回复:
大哥好,我是刚毕业不久的小弟,我也想问个问题,现在公司从asp.net转向了php,说PHP是趋势,大网站逐渐走向开源的方向,这是否意味着应该放弃asp.net(C#)投向PHP的怀抱呢?不知道您的建议和想法是?

刚毕业不推荐换啊亲,我觉得专攻一个厉害了比什么都强 --------------------编程问答-------------------- learning --------------------编程问答-------------------- 软件的客户端原来是用DELPHI写的,翻译成C#,服务器端是VC写的,原来的协议比较复杂,我就用DELPHI写了一个非常简单的

现在卡在了C#发送结构体,结构体中字符串与BYTE类型的都没有问题,但是发送整数据(delphi中integer,C#中int或Int32)收到的数据是错误的

另外如果结构体中有结构体数组时,应该如何写,如何给结构体的数据赋值呢?
上代码

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text;using System.Windows.Forms; using System.Runtime.InteropServices; using MTWS.Net.SocketClient;  namespace MTWS.Net.AppCode {     public partial class TestTcp : Form     
{
         public TestTcp()
         {
             InitializeComponent();
         }
          struct TMsgHeadInfo
         {
             //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
             public char MsgCode;
             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
             public char[] MsgType;
             public byte Sender;
             //public int SendInt;
         }
          struct TMsgBody
         {
             public TMsgHeadInfo msghead;   //假如这里是一个结构体数组时应该如何定义和赋值呢?
        //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
             //public TMsgHeadInfo[] msghead;  这样是不对的
       //public TMsgHeadInfo[2] msghead; 这样也不对      //此处到底应该怎样定义与赋值?另外,协议是原来定好了的,肯定不能变了,改协议来解决这个问题的话,就不用提了
      public Int32 body;   //这里哪个类型对就DELPHI里的integer?
         }
          public static byte[] StructToBytes(object structObj)
         {
             //得到结构体的大小
      int size = Marshal.SizeOf(structObj);
             //创建byte数组
             byte[] bytes = new byte[size];
           //分配结构体大小的内存空间
             IntPtr structPtr = Marshal.AllocHGlobal(size);
            //将结构体拷到分配好的内存空间
              Marshal.StructureToPtr(structObj, structPtr, false);
             //从内存空间拷到byte数组
            Marshal.Copy(structPtr, bytes, 0, size);
             //释放内存空间
             Marshal.FreeHGlobal(structPtr);
             //返回byte数组
            return bytes;
         }
        private void button1_Click(object sender, EventArgs e)
         {
             int ret;
            TMsgBody msgbody;
             //TMsgHeadInfo msghead;
             TCPClient tcp = new TCPClient();
             string code = "zp";
             string type = "ai";
             //string body = "cc";
             ret = tcp.ConnectServer("127.0.0.1", 3578);
             if (ret == 0)
             {
                 MessageBox.Show("连接服务器失败");
             }
             else
            {
                 MessageBox.Show("连接服务器成功");
                 msgbody.msghead.MsgCode = code.ToCharArray();
                  msgbody.msghead.MsgType = type.ToCharArray();
                  msgbody.msghead.Sender = 5;
                  msgbody.body = 44;//    服务器端收到后,实际不是44,其他数据类型没有问题
           byte[] msg = StructToBytes(msgbody);
                 if (tcp.SendMsg(msg) > 0)
                 {
                     MessageBox.Show("发送成功");
                 }
                 else
                {
                    MessageBox.Show("发送失败");
                 }
             }
          }
     }
 }

tcpclient类代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace MTWS.Net.SocketClient
{
    class TCPClient
    {
        //客户端socket
        Socket ClientSocket;
        IPEndPoint ipend;
        public TCPClient()
        {

        }

        ~TCPClient()
        {

        }

        public int ConnectServer(string IP, int Port)
        {
            int ret = 0;
            ipend = new IPEndPoint(IPAddress.Parse(IP), Port);
            ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                ClientSocket.Connect(ipend);
                ret = 1;
            }
            catch (SocketException ex)
            {
                ret = 0;
                //throw new Exception(ex.Message);
            }
            return ret;
        }

        public bool IsConnected()
        {
            return ClientSocket.Connected;
        }

        public int SendMsg(byte[] Msg)
        {
            if (IsConnected())
                return ClientSocket.Send(Msg, Msg.Length, SocketFlags.None);
            else
                return -1;
        }

        public int RecvMsg(byte[] Msg)
        {
            int bufLen = 0;
            bufLen = Msg.Length;
            if (IsConnected())
                return ClientSocket.Receive(Msg, bufLen, SocketFlags.None);
            else
                return -1;
        }
    }
}


服务器端delphi代码,组件用的indy9
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer, SyncObjs, WinSock;

type
  TChar2 = array[0..1] of Char;
  TMsgHead=packed record
    MsgCode, MsgType: TChar2;
    sender: Byte;
    //senderint: Integer;
  end;

  TMsgBody=packed record
    msgHead: TMsgHead;
    body: Integer;
  end;

  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure IdTCPServer1Connect(AThread: TIdPeerThread);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    IdTCPServer1.DefaultPort := 3578;
    IdTCPServer1.Active := True;
    //ShowMessage('ok');
  except
    on e: Exception do
      ShowMessage(e.Message);
  end;
end;

function Min(AValueOne, AValueTwo : Integer): Integer;
begin
  If AValueOne > AValueTwo then
  begin
    Result := AValueTwo
  end //If AValueOne > AValueTwo then
  else
  begin
    Result := AValueOne;
  end; //..If AValueOne > AValueTwo then
end;

function PCharToStr(ABuf: array of char; ABufLen: Integer): string;
{
  将PChar(#0结尾)转换为string
}
var
  LenOfStr: Integer;
begin
  LenOfStr := Min(ABufLen, StrLen(ABuf));
  if LenOfStr <= 0 then
  begin
    Result := '';
  end
  else
  begin
    SetLength(Result, LenOfStr);
    Move(ABuf[0], Result[1], LenOfStr);
  end;
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
//var msgHead: TMsgHead;
var msgBody: TMsgBody;
begin
  //while not Terminated do begin
    if AThread.Connection.Connected then begin
      //ShowMessage('aa');
      FillChar(msgBody, SizeOf(TmsgHead), 0);
      AThread.Connection.ReadBuffer(msgBody, SizeOf(TMsgbody));
      Edit1.Text := PCharToStr(msgBody.msgHead.MsgCode, 2);
      Edit2.Text := PCharToStr(msgBody.msgHead.MsgType, 2);
      Edit3.Text := IntToStr(Integer(msgBody.msgHead.sender));
      Edit4.Text := IntToStr(ntohl(msgBody.body));  //如果不加ntohl数据比较大,好像一个//地址,加上以后,出现高位丢失问题只限于256以下的数字,如果c#发256,delphi显示0,以此类似,到//了512,又显示0,513显示1
    end;
  //end;
end;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
  //ShowMessage(AThread.Connection.Socket.Binding.PeerIP);
end;

end.




C#中的结构体数组应该如何定义和赋值啊 --------------------编程问答--------------------
引用 71 楼 shuihan20e 的回复:
软件的客户端原来是用DELPHI写的,翻译成C#,服务器端是VC写的,原来的协议比较复杂,我就用DELPHI写了一个非常简单的

现在卡在了C#发送结构体,结构体中字符串与BYTE类型的都没有问题,但是发送整数据(delphi中integer,C#中int或Int32)收到的数据是错误的

另外如果结构体中有结构体数组时,应该如何写,如何给结构体的数据赋值呢?
上代码

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text;using System.Windows.Forms; using System.Runtime.InteropServices; using MTWS.Net.SocketClient;  namespace MTWS.Net.AppCode {     public partial class TestTcp : Form     
{
         public TestTcp()
         {
             InitializeComponent();
         }
          struct TMsgHeadInfo
         {
             //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
             public char MsgCode;
             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
             public char[] MsgType;
             public byte Sender;
             //public int SendInt;
         }
          struct TMsgBody
         {
             public TMsgHeadInfo msghead;   //假如这里是一个结构体数组时应该如何定义和赋值呢?
        //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
             //public TMsgHeadInfo[] msghead;  这样是不对的
       //public TMsgHeadInfo[2] msghead; 这样也不对      //此处到底应该怎样定义与赋值?另外,协议是原来定好了的,肯定不能变了,改协议来解决这个问题的话,就不用提了
      public Int32 body;   //这里哪个类型对就DELPHI里的integer?
         }
          public static byte[] StructToBytes(object structObj)
         {
             //得到结构体的大小
      int size = Marshal.SizeOf(structObj);
             //创建byte数组
             byte[] bytes = new byte[size];
           //分配结构体大小的内存空间
             IntPtr structPtr = Marshal.AllocHGlobal(size);
            //将结构体拷到分配好的内存空间
              Marshal.StructureToPtr(structObj, structPtr, false);
             //从内存空间拷到byte数组
            Marshal.Copy(structPtr, bytes, 0, size);
             //释放内存空间
             Marshal.FreeHGlobal(structPtr);
             //返回byte数组
            return bytes;
         }
        private void button1_Click(object sender, EventArgs e)
         {
             int ret;
            TMsgBody msgbody;
             //TMsgHeadInfo msghead;
             TCPClient tcp = new TCPClient();
             string code = "zp";
             string type = "ai";
             //string body = "cc";
             ret = tcp.ConnectServer("127.0.0.1", 3578);
             if (ret == 0)
             {
                 MessageBox.Show("连接服务器失败");
             }
             else
            {
                 MessageBox.Show("连接服务器成功");
                 msgbody.msghead.MsgCode = code.ToCharArray();
                  msgbody.msghead.MsgType = type.ToCharArray();
                  msgbody.msghead.Sender = 5;
                  msgbody.body = 44;//    服务器端收到后,实际不是44,其他数据类型没有问题
           byte[] msg = StructToBytes(msgbody);
                 if (tcp.SendMsg(msg) > 0)
                 {
                     MessageBox.Show("发送成功");
                 }
                 else
                {
                    MessageBox.Show("发送失败");
                 }
             }
          }
     }
 }

tcpclient类代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace MTWS.Net.SocketClient
{
    class TCPClient
    {
        //客户端socket
        Socket ClientSocket;
        IPEndPoint ipend;
        public TCPClient()
        {

        }

        ~TCPClient()
        {

        }

        public int ConnectServer(string IP, int Port)
        {
            int ret = 0;
            ipend = new IPEndPoint(IPAddress.Parse(IP), Port);
            ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                ClientSocket.Connect(ipend);
                ret = 1;
            }
            catch (SocketException ex)
            {
                ret = 0;
                //throw new Exception(ex.Message);
            }
            return ret;
        }

        public bool IsConnected()
        {
            return ClientSocket.Connected;
        }

        public int SendMsg(byte[] Msg)
        {
            if (IsConnected())
                return ClientSocket.Send(Msg, Msg.Length, SocketFlags.None);
            else
                return -1;
        }

        public int RecvMsg(byte[] Msg)
        {
            int bufLen = 0;
            bufLen = Msg.Length;
            if (IsConnected())
                return ClientSocket.Receive(Msg, bufLen, SocketFlags.None);
            else
                return -1;
        }
    }
}


服务器端delphi代码,组件用的indy9
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer, SyncObjs, WinSock;

type
  TChar2 = array[0..1] of Char;
  TMsgHead=packed record
    MsgCode, MsgType: TChar2;
    sender: Byte;
    //senderint: Integer;
  end;

  TMsgBody=packed record
    msgHead: TMsgHead;
    body: Integer;
  end;

  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure IdTCPServer1Connect(AThread: TIdPeerThread);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    IdTCPServer1.DefaultPort := 3578;
    IdTCPServer1.Active := True;
    //ShowMessage('ok');
  except
    on e: Exception do
      ShowMessage(e.Message);
  end;
end;

function Min(AValueOne, AValueTwo : Integer): Integer;
begin
  If AValueOne > AValueTwo then
  begin
    Result := AValueTwo
  end //If AValueOne > AValueTwo then
  else
  begin
    Result := AValueOne;
  end; //..If AValueOne > AValueTwo then
end;

function PCharToStr(ABuf: array of char; ABufLen: Integer): string;
{
  将PChar(#0结尾)转换为string
}
var
  LenOfStr: Integer;
begin
  LenOfStr := Min(ABufLen, StrLen(ABuf));
  if LenOfStr <= 0 then
  begin
    Result := '';
  end
  else
  begin
    SetLength(Result, LenOfStr);
    Move(ABuf[0], Result[1], LenOfStr);
  end;
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
//var msgHead: TMsgHead;
var msgBody: TMsgBody;
begin
  //while not Terminated do begin
    if AThread.Connection.Connected then begin
      //ShowMessage('aa');
      FillChar(msgBody, SizeOf(TmsgHead), 0);
      AThread.Connection.ReadBuffer(msgBody, SizeOf(TMsgbody));
      Edit1.Text := PCharToStr(msgBody.msgHead.MsgCode, 2);
      Edit2.Text := PCharToStr(msgBody.msgHead.MsgType, 2);
      Edit3.Text := IntToStr(Integer(msgBody.msgHead.sender));
      Edit4.Text := IntToStr(ntohl(msgBody.body));  //如果不加ntohl数据比较大,好像一个//地址,加上以后,出现高位丢失问题只限于256以下的数字,如果c#发256,delphi显示0,以此类似,到//了512,又显示0,513显示1
    end;
  //end;
end;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
  //ShowMessage(AThread.Connection.Socket.Binding.PeerIP);
end;

end.




C#中的结构体数组应该如何定义和赋值啊


这个要看服务端结构的对齐方式了
在结构上加上一行试试
 [StructLayout(LayoutKind.Sequential, Pack = 1)]
 struct TMsgHeadInfo
         {
             //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
             public char MsgCode;
             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
             public char[] MsgType;
             public byte Sender;
             public int SendInt;
         }

--------------------编程问答-------------------- 来个杂志 --------------------编程问答--------------------
引用 72 楼 SocketUpEx 的回复:
Quote: 引用 71 楼 shuihan20e 的回复:

软件的客户端原来是用DELPHI写的,翻译成C#,服务器端是VC写的,原来的协议比较复杂,我就用DELPHI写了一个非常简单的

现在卡在了C#发送结构体,结构体中字符串与BYTE类型的都没有问题,但是发送整数据(delphi中integer,C#中int或Int32)收到的数据是错误的

另外如果结构体中有结构体数组时,应该如何写,如何给结构体的数据赋值呢?
上代码

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text;using System.Windows.Forms; using System.Runtime.InteropServices; using MTWS.Net.SocketClient;  namespace MTWS.Net.AppCode {     public partial class TestTcp : Form     
{
         public TestTcp()
         {
             InitializeComponent();
         }
          struct TMsgHeadInfo
         {
             //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
             public char MsgCode;
             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
             public char[] MsgType;
             public byte Sender;
             //public int SendInt;
         }
          struct TMsgBody
         {
             public TMsgHeadInfo msghead;   //假如这里是一个结构体数组时应该如何定义和赋值呢?
        //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
             //public TMsgHeadInfo[] msghead;  这样是不对的
       //public TMsgHeadInfo[2] msghead; 这样也不对      //此处到底应该怎样定义与赋值?另外,协议是原来定好了的,肯定不能变了,改协议来解决这个问题的话,就不用提了
      public Int32 body;   //这里哪个类型对就DELPHI里的integer?
         }
          public static byte[] StructToBytes(object structObj)
         {
             //得到结构体的大小
      int size = Marshal.SizeOf(structObj);
             //创建byte数组
             byte[] bytes = new byte[size];
           //分配结构体大小的内存空间
             IntPtr structPtr = Marshal.AllocHGlobal(size);
            //将结构体拷到分配好的内存空间
              Marshal.StructureToPtr(structObj, structPtr, false);
             //从内存空间拷到byte数组
            Marshal.Copy(structPtr, bytes, 0, size);
             //释放内存空间
             Marshal.FreeHGlobal(structPtr);
             //返回byte数组
            return bytes;
         }
        private void button1_Click(object sender, EventArgs e)
         {
             int ret;
            TMsgBody msgbody;
             //TMsgHeadInfo msghead;
             TCPClient tcp = new TCPClient();
             string code = "zp";
             string type = "ai";
             //string body = "cc";
             ret = tcp.ConnectServer("127.0.0.1", 3578);
             if (ret == 0)
             {
                 MessageBox.Show("连接服务器失败");
             }
             else
            {
                 MessageBox.Show("连接服务器成功");
                 msgbody.msghead.MsgCode = code.ToCharArray();
                  msgbody.msghead.MsgType = type.ToCharArray();
                  msgbody.msghead.Sender = 5;
                  msgbody.body = 44;//    服务器端收到后,实际不是44,其他数据类型没有问题
           byte[] msg = StructToBytes(msgbody);
                 if (tcp.SendMsg(msg) > 0)
                 {
                     MessageBox.Show("发送成功");
                 }
                 else
                {
                    MessageBox.Show("发送失败");
                 }
             }
          }
     }
 }

tcpclient类代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace MTWS.Net.SocketClient
{
    class TCPClient
    {
        //客户端socket
        Socket ClientSocket;
        IPEndPoint ipend;
        public TCPClient()
        {

        }

        ~TCPClient()
        {

        }

        public int ConnectServer(string IP, int Port)
        {
            int ret = 0;
            ipend = new IPEndPoint(IPAddress.Parse(IP), Port);
            ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                ClientSocket.Connect(ipend);
                ret = 1;
            }
            catch (SocketException ex)
            {
                ret = 0;
                //throw new Exception(ex.Message);
            }
            return ret;
        }

        public bool IsConnected()
        {
            return ClientSocket.Connected;
        }

        public int SendMsg(byte[] Msg)
        {
            if (IsConnected())
                return ClientSocket.Send(Msg, Msg.Length, SocketFlags.None);
            else
                return -1;
        }

        public int RecvMsg(byte[] Msg)
        {
            int bufLen = 0;
            bufLen = Msg.Length;
            if (IsConnected())
                return ClientSocket.Receive(Msg, bufLen, SocketFlags.None);
            else
                return -1;
        }
    }
}


服务器端delphi代码,组件用的indy9
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer, SyncObjs, WinSock;

type
  TChar2 = array[0..1] of Char;
  TMsgHead=packed record
    MsgCode, MsgType: TChar2;
    sender: Byte;
    //senderint: Integer;
  end;

  TMsgBody=packed record
    msgHead: TMsgHead;
    body: Integer;
  end;

  TForm1 = class(TForm)
    IdTCPServer1: TIdTCPServer;
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit4: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure IdTCPServer1Execute(AThread: TIdPeerThread);
    procedure IdTCPServer1Connect(AThread: TIdPeerThread);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    IdTCPServer1.DefaultPort := 3578;
    IdTCPServer1.Active := True;
    //ShowMessage('ok');
  except
    on e: Exception do
      ShowMessage(e.Message);
  end;
end;

function Min(AValueOne, AValueTwo : Integer): Integer;
begin
  If AValueOne > AValueTwo then
  begin
    Result := AValueTwo
  end //If AValueOne > AValueTwo then
  else
  begin
    Result := AValueOne;
  end; //..If AValueOne > AValueTwo then
end;

function PCharToStr(ABuf: array of char; ABufLen: Integer): string;
{
  将PChar(#0结尾)转换为string
}
var
  LenOfStr: Integer;
begin
  LenOfStr := Min(ABufLen, StrLen(ABuf));
  if LenOfStr <= 0 then
  begin
    Result := '';
  end
  else
  begin
    SetLength(Result, LenOfStr);
    Move(ABuf[0], Result[1], LenOfStr);
  end;
end;

procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
//var msgHead: TMsgHead;
var msgBody: TMsgBody;
begin
  //while not Terminated do begin
    if AThread.Connection.Connected then begin
      //ShowMessage('aa');
      FillChar(msgBody, SizeOf(TmsgHead), 0);
      AThread.Connection.ReadBuffer(msgBody, SizeOf(TMsgbody));
      Edit1.Text := PCharToStr(msgBody.msgHead.MsgCode, 2);
      Edit2.Text := PCharToStr(msgBody.msgHead.MsgType, 2);
      Edit3.Text := IntToStr(Integer(msgBody.msgHead.sender));
      Edit4.Text := IntToStr(ntohl(msgBody.body));  //如果不加ntohl数据比较大,好像一个//地址,加上以后,出现高位丢失问题只限于256以下的数字,如果c#发256,delphi显示0,以此类似,到//了512,又显示0,513显示1
    end;
  //end;
end;

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
  //ShowMessage(AThread.Connection.Socket.Binding.PeerIP);
end;

end.




C#中的结构体数组应该如何定义和赋值啊


这个要看服务端结构的对齐方式了
在结构上加上一行试试
 [StructLayout(LayoutKind.Sequential, Pack = 1)]
 struct TMsgHeadInfo
         {
             //[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
             public char MsgCode;
             [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
             public char[] MsgType;
             public byte Sender;
             public int SendInt;
         }


好像不对,加上了和原来的结果一样,有人说和字节序有关系  --------------------编程问答-------------------- 你截包看看DELPHI的Buffer是什么
才知道对齐的方式

--------------------编程问答-------------------- 很好,非常不错 --------------------编程问答-------------------- 什么玩意阿阿? --------------------编程问答-------------------- 弱弱的问一下,我的问题是不是太简单了呢?可以回复一下吗?谢谢专家了。。。 --------------------编程问答-------------------- 除 --------------------编程问答-------------------- 我也想學C#,來關注一下囉 --------------------编程问答-------------------- 好多砖家啊。
来学习学习 --------------------编程问答-------------------- 谢谢分享了,呵呵  --------------------编程问答-------------------- 好学..... --------------------编程问答-------------------- 曹版还不冒泡呢 --------------------编程问答-------------------- 还没有看到主角啊 --------------------编程问答--------------------
引用 84 楼 llyyqq123 的回复:
曹版还不冒泡呢


引用 85 楼 ZR__MaNong 的回复:
还没有看到主角啊


最近曹MVP很露脸啊

--------------------编程问答-------------------- mqsvc.exe进程,当System.Messaging.MessageQueue.Send(object)上百次上千次后,占了很大的内存很大。
有什么方法可以限制或回收它的占的内存呢? --------------------编程问答-------------------- 工作一年了,为啥觉得自己提升的不大呢?是哪里出了问题了呢?觉得自己还是小白。求大牛给点指点,怎么样提升自己的能力呢?从哪里开始呢? --------------------编程问答-------------------- 斑竹猪脚不在么? --------------------编程问答-------------------- --------------------编程问答-------------------- 曹大人在等破500楼之后再出来解答大家的问题 --------------------编程问答-------------------- 盖楼盖楼,等500楼先真身 --------------------编程问答-------------------- 很不错哎,楼主给力,thanks --------------------编程问答-------------------- --------------------编程问答--------------------   学习  学习  这样活动多举办 --------------------编程问答-------------------- 支持一下@! --------------------编程问答-------------------- 看来需要抓住这个机会,求一份完善的解决方案。
1 场景描述
  (0)Windows平台,开发语言C#,通信要求大对象数据传输
  (1)组成内容:客户端,
             应用服务器(windows服务承载):所有的客户端都通过应用服务器实现业务逻辑。负责与设备终端数据处理服务器,数据库,客户端大对象通讯。接收设备终端服务器数据上传请求,在写入数据库的同时向已注册客户端实时发送由设备终端上传的数据。
             设备终端数据处理服务器:负责接收,处理由设备终端传输的数据,并向应用服务器进行提交。
             数据库:SQLServer2008等
             设备终端:如常见的能够采集GPS信息的安卓智能手机。
             
  (2)相互关系:A 客户端与应用服务器关系
                   首先建立连接实现数据增删查改操作这个很简单。其次客户端注册服务器事件,接收由服务器主动推送过来的实时数据。
             B 设备终端与设备终端数据处理服务器关系
                   设备终端与设备终端处理服务器建立连接,实时上传所采集的数据,在进行加工处理后向应用服务器提交。
             C 设备数据处理服务器与应用服务器关系
                   设备服务器向应用服务器建立连接,上传数据,应用服务器接收该数据,并向数据库中写入,同时向已登陆的客户端实时主动推送该数据。这里非常重要,也是问题的关键点。
             D 应用服务器与数据库的关系
                    首先应用服务器作为客户端与数据库中间件,响应客户端的增删查改请求,这个很简单。其二应用服务器能够将设备数据处理服务器所上传的数据实时写入数据库,并向已注册客户端实时推送。

2 重点难题
  (1)通信
   客户端能够接收到服务器实时推送的数据,并且是大对象的传输,最好能够使Rest的服务类型,请问这个该怎么个解决方案,怎样才能实现服务器向客户端实时的主动的大对象的数据推送?
  (2)客户端通过注册服务器推送数据,也就是说我客户端想接受就注册不想接受服务器推送过来的数据我就不注册,怎样解决?
  
3 附基本结构图
  
4 求一份完善的解决方案
                    --------------------编程问答-------------------- 怎么没有人回答 --------------------编程问答--------------------
C# winform开发,为了让客户端更加瘦小,想用三层结构,给点思路。 --------------------编程问答-------------------- 一个困扰我很久的问题,求帮助!
环境:VS2008 C# winform wince6.0
问题:现在需要开发wince6下的应用程序,其中需要绘制曲线。根据得到的数据大小,绘制不同的颜色的线条。但发现绘图的速度实在是太慢。

private void DrawImage()
        {
            _rtClient = new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height);
            if (_bPainting)
                return;
            _bPainting = true;
 
            if (_gBmp == null)
            {
                _gBmp = new Bitmap(_rtClient.Width, _rtClient.Height);
                _g = Graphics.FromImage(_gBmp);
            }
            _g.Clear(Color.White);
 
            int cyc = 64 * 50; //需要绘制的线条数
            int colorIndex=0;
            for (int i = 0; i < cyc; i++)
            {
                colorIndex = GetColorIndex(i);  //根据每个数据的不同,得到不同的颜色,然后绘制竖线
                _g.DrawLine(_colorPen[colorIndex], _rtClient.Left + i * _rtClient.Width / cyc, _rtClient.Top + 10, _rtClient.Left + i * _rtClient.Width / cyc, _rtClient.Bottom - 10);
            }
            pictureBox1.Image = _gBmp;
            pictureBox1.Refresh();
            _bPainting = false;
        }

//总耗时:2100 ms
//for循环耗时:2070ms


以上测试的代码,运行需要2s左右一次,界面完全卡死了,求大神,有没有好点的方法,加快绘图速度啊,使得速度在200ms以内。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,