标题:异步tcp通讯程序中读写文件的问题--第一次发帖请多关照
只看楼主
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
得分:0 
自己顶一个。。。。
那个可以改嘛?

2006-08-11 08:15
chenjin145
Rank: 1
等 级:禁止访问
帖 子:3922
专家分:0
注 册:2006-7-12
得分:0 
在真的內容報文前
加倆個byte來保存id 呢

還有 那個data文件取出來的內容 有索引沒?
看它的方法好像要取一個list 刪掉 再取下一個list

[url=javascript:alert(1);] [div]fdgfdgfdg\" on\"[/div] [/url]
2006-08-11 08:43
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
得分:0 
private unsafe void button1_Click(object sender, System.EventArgs e)
{
Test_Struct data = new Test_Struct();
byte[] bt;
string strV = "Hello, this is a test";
//bt = strV.ToCharArray();
bt = Encoding.ASCII.GetBytes(strV);
int l=bt.Length;
data.tel_id = 99887;
data.test_data = 99999;
data.Telegram=new byte[l];
bt.CopyTo(data.Telegram,0);
//System.Runtime.InteropServices.Marshal.Copy(bt, 0, data.Telegram, bt.Length);
///Buffer.BlockCopy(bt, 0, data.Telegram, 0, bt.Length);
//data.Telegram = strV;
//ip = new IntPtr((void *)data.Telegram);
//System.Runtime.InteropServices.Marshal.Copy(bt,0,ip,bt.Length);
//MessageBox.Show(data.Telegram[0].ToString());

fixed(byte *p = data.Telegram)
{
//p = (byte *)data.Telegram;
try
{
stlc.AddToHead(ref p[0], l,1);
}
catch (Exception et)
{
MessageBox.Show(et.Message);
}
}
strV = string.Format("After add data. total {0} telegrams in list", stlc.Size);
MessageBox.Show(strV);
}



你给我的写入文件代码中有几个问题,不能运行。
最主要的是:
fixed(byte * pp=data.Telegram)
提示:错误 14 不能使用 fixed 语句来获取已固定的表达式的地址
由于我一直不知道什么叫做已固定的表达式,实在不知道如何改。
fixed(byte * pp=data) 这样子也不行
所以,即使我想要在真正的报文前面加入两个id号到时候截断字符串也无法成功。



2006-08-11 17:01
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
得分:0 
data.Telegram=new byte[l];
byte数组之间不能如此赋值
必须用 System.Runtime.InteropServices.Marshal.Copy 而在该函数中,必须有一个参数为 Intptr类型。
public static void Copy (byte[] source,    int startIndex,    IntPtr destination,int length)


2006-08-11 17:07
chenjin145
Rank: 1
等 级:禁止访问
帖 子:3922
专家分:0
注 册:2006-7-12
得分:0 

那不是賦值,那是分配內存

Marshal.Copy 是從拖管/非拖管copy到非拖管/拖管的時候才用的


而且我的運行也是成功的,data裡面的數據是空格+亂七八糟的字符 不過獲取出來又會解碼回來
注意到它又gethead和getrail應該一個list裡面可以存兩個數據
還又個參數recordid不知道又何作用,我試著把它當index來用,但卻沒效果

fixed是告訴程序這一塊不要拉幾回收


[url=javascript:alert(1);] [div]fdgfdgfdg\" on\"[/div] [/url]
2006-08-11 17:20
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
得分:0 
这个,我想问一下:
你是在异步通讯的时候在onreceivedata里面调用这个函数吗?
我在单线程情况下调用的时候是可以运行的,但是现在在异步通讯的server接受到数据的时候就立刻调用它,然后用根据你那个改写以后的
private unsafe void AddIntoFile(string ss)
{
string strT = ss;
byte[] buf;

System.Text.ASCIIEncoding ae = new ASCIIEncoding();

int l;
int j;


buf = ae.GetBytes(strT);

l = buf.Length;

stlc.AddToHead(ref buf[0], l, 0);


strT = string.Format("Add telegram success, total {0}", stlc.Size);
MessageBox.Show(strT);

}
private unsafe void btnReadData_Click(object sender, EventArgs e)
{
byte[] buf = new byte[4086];
//int telid;
int l;
//string strV;
//string strV1;
//IntPtr p = new IntPtr((void *)&data);
fixed (byte* p = buf)
{
try
{
if (stlc.Size > 0)
{
l = stlc.GetFromTail(ref p[0], 0);
stlc.DelFromTail(1);
MessageBox.Show(Encoding.ASCII.GetString(buf, 0, l));
}
else
{
MessageBox.Show("no data");
}
}
catch (Exception et)
{
MessageBox.Show(et.Message);
}
}


}

这样子只能保证第一个字母是对的,后面就是乱码了。
读出来比如 发送 textbox
读出来就是 t???

是不是 fixed语句有问题?
stlc.AddToHead(ref buf[0], l, 0);
只绑定了第一个字节?
但是我记得数组好像是第一个字节的地址就是数组的开始地址啊

现在只能运行保证第一个字母氏对的 后面都是乱的


2006-08-11 17:49
chenjin145
Rank: 1
等 级:禁止访问
帖 子:3922
专家分:0
注 册:2006-7-12
得分:0 
那到沒有
我是直接傳個string測試的

應該也不會錯吧,下次再用回調來試一下,

現在下班了, 哈哈,準備吃飯去了

[url=javascript:alert(1);] [div]fdgfdgfdg\" on\"[/div] [/url]
2006-08-11 17:54
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
得分:0 
谢了,我也回家了。。。

2006-08-11 18:15
jingzhao22visa
Rank: 1
等 级:新手上路
威 望:1
帖 子:343
专家分:0
注 册:2006-8-10
得分:0 
chenjin145。。。。
那个异步调用的话你可以实现文件的写入和读取吗?
我后来回去发现还是出现问题,没有办法解决。
我又重新发了一个帖子。

2006-08-14 09:15



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-83145-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.231294 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved