即能传文件,又能传消息怎样考虑接收端,看我的代码,我的是这样处理的,但是有问题 same 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 补充一下,我的意思是在传文件的同时,也能传消息tcp 方式,WSAansyselect i/o 模型,C/S都是这样M-我将循环发送消息的数据前加上了‘M’每条都加F-我将循环发送文件前加上了‘F’每条都加接受时我判断数据是否有‘M’和‘F’,做响应的判断,然后处理但是,发文件时有问题,先删除数据前的‘F’字符,然后处理 问题是文件不正常,文件格式修改了,有问题 首先不明白为什么要发消息,消息不是FD_XXX吗?文件问题,我估计是文件分割时的问题 bool CSocket_sdk_sDlg::RevData(){ char bufx[1024]={0}; char buf[1024]={0}; CString string; int n=0; int ret=0; CString szTextNow; n=recv(sclientRev,bufx,1024,0); //接受 if(n==SOCKET_ERROR) { AfxMessageBox("error"); return false; } string.Format("%s",bufx); if (string.Mid(0,1)=="M") { string.Delete(0,1); GetDlgItem(IDC_EDIT2)->GetWindowText(szTextNow); szTextNow+=string; GetDlgItem(IDC_EDIT2)->SetWindowText(szTextNow); } else if (string.Mid(0,1)=="F") { if (nRecIndex==0) { GetDlgItem(IDC_BUTTON3)->EnableWindow(false); string.Delete(0,1); m_szFilename=string; } else if (nRecIndex==1) { string.Delete(0,1); m_szFileSize=string; m_proess.SetRange32(0,atol(m_szFileSize)); } else { string.Delete(0,1); strcpy(buf,string); file.Write(buf,n); } nNum+=n; m_proess.SetPos(nNum); nRecIndex++; if (m_proess.GetPos()==atol(m_szFileSize)) { GetDlgItem(IDC_BUTTON3)->EnableWindow(true); GetDlgItem(IDC_revflag)->SetWindowText("文件传输成功!"); } } return true;} 数据和文件的接收,都是FD_READ消息触发后循环的触发(因为发送是循环的发送).调用上面的函数 bufx这个接收数组,在recv前,先用ZeroMemory()清空 string.Delete(0,1);strcpy(buf,string);file.Write(buf,n);1.你收到了n个字节数据,你自己去掉了前面的'F',居然还往文件里写n个字节,不是每条都增加了一个字节?2.字符串的存放,最后会以'\0'结尾,是否把'\0'也写进文件去了,这样每条又增加一个字节.因此,如果你个二进制文件传输过来,被你插入了无数字节,文件格式还对才怪!你检查一下,传输过来的数据组成的文件是否比原来文件大了很多?如果是大了,就是以上原因 求从网页下载并注册ActiveX控件的代码及详细部署流程(HTM,ASP都行) vc6编译出现的问题 刚装上的 散分:新手发问 请教一个关于InstallShield的问题,关于CallDLLFx函数的使用 用过FLib的兄弟看过来!救急! 关于DLL中的CBitmap变量 cystal report 释放连接 为什么没人理我了????? 求助,MFC图表控件,求大神 我在绘图区显示了几张图片,想清除它,就是让绘图区变白如何做? VC交友...散分 关于DLL的简单问题
tcp 方式,WSAansyselect i/o 模型,C/S都是这样
M-我将循环发送消息的数据前加上了‘M’每条都加
F-我将循环发送文件前加上了‘F’每条都加
接受时我判断数据是否有‘M’和‘F’,做响应的判断,然后处理
但是,发文件时有问题,
先删除数据前的‘F’字符,然后处理 问题是文件不正常,文件格式修改了,有问题
文件问题,我估计是文件分割时的问题
{
char bufx[1024]={0};
char buf[1024]={0};
CString string;
int n=0;
int ret=0;
CString szTextNow;
n=recv(sclientRev,bufx,1024,0); //接受
if(n==SOCKET_ERROR)
{
AfxMessageBox("error");
return false;
}
string.Format("%s",bufx);
if (string.Mid(0,1)=="M")
{
string.Delete(0,1);
GetDlgItem(IDC_EDIT2)->GetWindowText(szTextNow);
szTextNow+=string;
GetDlgItem(IDC_EDIT2)->SetWindowText(szTextNow);
}
else if (string.Mid(0,1)=="F")
{
if (nRecIndex==0)
{
GetDlgItem(IDC_BUTTON3)->EnableWindow(false);
string.Delete(0,1);
m_szFilename=string;
}
else if (nRecIndex==1)
{
string.Delete(0,1);
m_szFileSize=string;
m_proess.SetRange32(0,atol(m_szFileSize));
}
else
{
string.Delete(0,1);
strcpy(buf,string);
file.Write(buf,n);
}
nNum+=n;
m_proess.SetPos(nNum);
nRecIndex++;
if (m_proess.GetPos()==atol(m_szFileSize))
{
GetDlgItem(IDC_BUTTON3)->EnableWindow(true);
GetDlgItem(IDC_revflag)->SetWindowText("文件传输成功!");
}
}
return true;
}
这个接收数组,在recv前,先用ZeroMemory()清空
strcpy(buf,string);
file.Write(buf,n);1.你收到了n个字节数据,你自己去掉了前面的'F',居然还往文件里写n个字节,不是每条都增加了一个字节?
2.字符串的存放,最后会以'\0'结尾,是否把'\0'也写进文件去了,这样每条又增加一个字节.因此,如果你个二进制文件传输过来,被你插入了无数字节,文件格式还对才怪!
你检查一下,传输过来的数据组成的文件是否比原来文件大了很多?
如果是大了,就是以上原因