首页 新闻 会员 周边

求救~socket自定义TCP传输文件,只能接收4M内容,后面的数据库包获取不到啊 求救~socket 文件接收只能获得4M内容,后面的数据库包获取不到啊. 我捣鼓这个问题弄了一个星期了,实在搞不明白。真是没办法了,所以推上首页问问。阿弥陀佛 这是两个方法: view sourceprint? /// <summary> /// 获取标示 /// </summary&g

0
悬赏园豆:50 [待解决问题]

求救~socket 文件接收只能获得4M内容,后面的数据库包获取不到啊.

我捣鼓这个问题弄了一个星期了,实在搞不明白。真是没办法了,所以推上首页问问。阿弥陀佛

这是两个方法:

 

/// <summary>
/// 获取标示
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private static byte[] ReceiveVarFlag(Socket s)
{
int recv;
byte[] datasize = new byte[4];
recv
= s.Receive(datasize, 0, 4, SocketFlags.None);
return datasize;
}

/// <summary>
/// 按照长度获取内容
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private static byte[] ReceiveVarContent(Socket s,int len)
{
int recv;
byte[] datasize = new byte[len];
recv
= s.Receive(datasize, 0, len, SocketFlags.None);
return datasize;
}

这是main函数:

static string filesfolder = "c:\\xxx\\";
static void Main(string[] args)
{

int port = 12345;
//string hostip = "127.0.0.1";
//IPAddress ip = IPAddress.Parse(hostip);
IPEndPoint ipe = new IPEndPoint(IPAddress.Any, port);
Socket s
= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Bind(ipe);
s.Listen(
0);
Console.WriteLine(
"Waitforconnect");
while (true)
{
int packsiez = 4;
Socket temp
= s.Accept();
byte[] biaoshi = new byte[4];
byte[] nssid = new byte[4];
byte[] urllen = new byte[4];

byte[] filelen = new byte[4];

//------------

//------------

biaoshi
= ReceiveVarFlag(temp);
nssid
= ReceiveVarFlag(temp);
urllen
= ReceiveVarFlag(temp);
int _urllen = BitConverter.ToInt32(urllen, 0);
byte[] urlcontent = new byte[_urllen];
urlcontent
= ReceiveVarContent(temp, _urllen);
filelen
= ReceiveVarFlag(temp);

int _biaoshi = BitConverter.ToInt32(biaoshi, 0);
int _nssid = BitConverter.ToInt32(nssid, 0);
string _urlcontent = Encoding.Default.GetString(urlcontent);
Random r
= new Random();
string filename = DateTime.Now.ToString("yyyyMMddHHmmss") + r.Next();



int _filelen = BitConverter.ToInt32(filelen, 0);

int rescount = _filelen / packsiez;
int lastpacksizi = _filelen % packsiez;
if (lastpacksizi!=0)
{
rescount
++;
}
string SendFileName = filesfolder + filename + ".rar";
int wcount=0;
using (FileStream MyFileStream = new FileStream(SendFileName, FileMode.Create, FileAccess.Write))
{
for (int i = 0; i <rescount; i++)
{
if (temp.Connected)
{
if (i==rescount-1)
{
packsiez
= lastpacksizi;
}
byte[] t=new byte[packsiez];
int counts= temp.Receive(t, 0, packsiez, SocketFlags.None);
if (counts==0)
{
break;
}
MyFileStream.Write(t,
0, packsiez);
wcount
+=packsiez;
t
= null;
}
else
{
break;
}
}
}
Console.WriteLine(
"-----------------------------------------------");
Console.WriteLine(
"包总长:" + _filelen.ToString() +"保存:" + wcount );
Console.WriteLine(
"文件内容写入:" + SendFileName);
WriteInfos(_biaoshi, _nssid, _urllen, _urlcontent, filename);
//写入日志信息

}
}
 

我每次大概只能获得4100KB的东西。

如果不退出,继续获取,那么获得的全是空。最后用UE看文件,文件大小是对上了,但是后半截内容全是0x00

君宝的主页 君宝 | 初学一级 | 园豆:97
提问于:2011-04-22 10:17
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册