异步tcp通讯程序中读写文件的问题--第一次发帖请多关照
刚进公司实习,被分配做socket通讯的程序。实在搞不定,请大家帮忙。情况:
程序中已经实现了C/S之间的信息发送与接收,收发无误。但是现在要求要将收到的数据放入一个.dat文件。我所使用的收发全部是异步调用。例如BeginConnect,BeginReceive。
部分程序代码如下:
public unsafe void OnReceiveData(IAsyncResult ar)
{ Sock = (Socket)ar.AsyncState;
try
{ int nBytesRec = Sock.EndReceive(ar);
if (nBytesRec > 0)
{
。。。。。。。。。。。。。
string ss = Encoding.BigEndianUnicode.GetString(Receive_Buffer, 0, nBytesRec);
listBox_Receive.Items.Add(ss);
AddintoFile(ss);///在此处调用一个函数将收到的字符串写入文件。
Sock.BeginReceive(Receive_Buffer, 0, Receive_Buffer.Length,
SocketFlags.None,
new AsyncCallback(OnReceiveData),
Sock);
}
private unsafe void AddintoFile(string ss) //struct结构在最底下。
{
Test_Struct data;
byte* p;
char[] bt;
IntPtr ip;
string strV = ss;
bt = strV.ToCharArray();
data.tel_id = 99887;
data.test_data = 99999;
//fixed(byte * t=data.Telegram)
//{
//byte* tempt = t;
System.Runtime.InteropServices.Marshal.Copy(bt, 0, (IntPtr)data.Telegram, bt.Length);
p = (byte*)&data;
try
{
stlc.AddToHead(ref *p, sizeof(Test_Struct), 1);
}
*********************************************************
stlc.AddToHead(ref *p, sizeof(Test_Struct), 1);
此处的AddToHead函数是别人给的一个dll里面的函数
ref *p 引用的byte数组。即是要写入文件的bytes
sizeof(Test_Struct) 要写进去的bytes的长度
这个函数经过测试,是可以用的。当然是在单线程的
工作环境下。在这个异步调用的程序代码下,我经过
设置断点,只能看到确实执行了该句插入,也没有抛出异常。
但是就是文件里面写不进去。
我查了一些东西,可能是因为垃圾回收的问题,需要
将指针固定。但是固定指针的时候一直报错。fixed()
语句中一直不能用,说不能引用固定长度的指针。
p = (byte*)&data; 。(IntPtr)data.Telegram
使用fixed的时候就这两个地方出错。
有没有人帮忙看一下。
如果没有说清楚,我再补充。
*********************************************************
catch (Exception et)
{
MessageBox.Show(et.Message);
}
// }
strV = string.Format("After add data. total {0} telegrams in list", stlc.Size);
MessageBox.Show(strV);
}
private unsafe struct Test_Struct
{
public int tel_id;
public fixed byte Telegram[2048];
public int test_data;
}