CSOCKET中send(setbuf,20000)返加正确值,receive(receivebuf,20000),竟然要分成几段接收,后面的会覆盖前面的,怎么办啊大哥,我要根据头几个字节来检验,那除了第一段后面的就没有可叛字节了
解决方案 »
- 请问如何创建一个表格,又怎么删除他的列呢?
- 如何做这样的工具栏--在工具栏上加入象Word中为输入文字设置下划线,设置字体颜色那样的工具按钮?
- SQL语句的写法:怎么样将一个表的结构拷贝到另一张新表。即Create Talbe 表1(这里用一条语句表示表的结构)。这样可以实现吗?
- dll调用问题
- (CMainFrame*)AfxGetApp()->m_pMainWnd;
- 我在listen 后用accept得到连上来的客户端消息,我想得到这个客户端的IP,怎么取得?
- 使用VC编辑代码,有时不能自动弹出类或结构的成员。求原因及完整解决方案!
- 一个很有难度的COM问题!(送100分)
- 谁能帮我解决一下多线程的问题?
- 一个c++读取.ini文件问题
- 对双缓冲解决图片闪烁的疑问?
- 如果我有一个类的成员对象是引用,同时这个成员对象又要用此类的this指针来初始化,每次都得到一个警告,很不爽
char szReadBuf[READ_BUFFER_SIZE+1];
int num;
....
ZeroMemory(receivebuf,Max_BUFFER_SIZE+1);
char *pBuf=receivebuf;
while(1)
{
ZeroMemory(szReadBuf,READ_BUFFER_SIZE+1);
num=pSocket.Receive(szReadBuf,READ_BUFFER_SIZE);
if(num==SOCKET_ERROR)
{
//出错了,加入你的处理
break;
}
else
{
if(num>0)
{
//这段代码的计算也许有错,如果错了,就把指针再加1来试试吧
memcpy(pBuf,szReadBuf,num);
pBuf+=num;
}
else if(num==0)
{
//接收完毕,加入你的处理
break;
}
else
{
//出错了,加入你的处理
break;
}
}
}//while(1)
UINT ListenThread(LPVOID lparam)
{
CSocket sk,skrecv;
sk.Create(9000);
sk.Listen ();
char strRec[20001];
char read[4000];
static long al=0;
while(sk.Accept (skrecv))
{
char *pBuf=strRec;
while(1)
{
memset(read,0,sizeof(read));
int num=skrecv.Receive(read,4000,0);
if(num==SOCKET_ERROR)
{
//出错了,加入你的处理
MessageBox(NULL,"接收出错啦","错误",MB_OK);
break;
}
else
{
if(num>0)
{
//这段代码的计算也许有错,如果错了,就把指针再加1来试试吧
//memcpy(pBuf,read,num);
// pBuf+=num;
if(a==1)
{
DeleteFile("E:\\recv.bmp");
a++;
}
CFile f;
f.Open("E:\\recv.bmp",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite|CFile::typeBinary);//
f.SeekToEnd ();
f.Write(read,num);
//f.Write ("\r\n",2);
f.Close ();
}
else if(num==0)
{ //接收完毕,加入你的处理
break;
}
else
{
//出错了,加入你的处理
MessageBox(NULL,"接收出错啦2","错误",MB_OK);
break;
}
}
}//while(1)
skrecv.Close ();
} return 0;
}
//发
void CCNetProgDlg::OnSend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
CString strTemp;
GetDlgItem(IDC_EDIT_TEXT)->GetWindowText(strTemp);
strTemp.TrimLeft();strTemp.TrimRight();
if(strTemp=="")
strTemp="没有输入文本";
CSocket sk;
sk.Create ();
if(!sk.Connect ("172.16.8.221",9000))
{
MessageBox("连接目标失败","网络错误",MB_OK);
sk.Close ();
return;
}
sk.Send (strTemp,strTemp.GetLength (),0);
sk.Close ();
}
long len = 0 ;len += receive(receivebuf+len, 20000),
long len = 0 ;len += receive(receivebuf+len, 20000),
以便接收的时候好知道是什么数据最好不要用recieve()来阻塞线程
另外,可以用GetSockOpt()来得到缓冲的长度,
一般默认的是8K。
多次接收的方法就用 rtdb(东临碣石)兄的。
故有时SEVER用
psocket->send(buf1,200);
psocket->send(buf2,8000);
结果client端把两段混在一起了
但只要
psocket->send(buf1,200);
//隔一小段时间
psocket->send(buf2,8000);
接收端就能分开两次接收
int nLen=4;
SetSockOpt(SO_SNDBUF,&nValue,nLen);
这样就把发送缓冲设为1024BYTES了。
接收缓冲是SO_RCVBUF,具体看MSDN吧。