mfc socket 若发送“abc”过去就只能接收到“a” 要是发“d”过去,就没问题!

voidCEX_ChatDlg::OnBnClickedButtonSend(){//TODO:在此添加控件通知处理程序代码UpdateData();if(m_strMs... void CEX_ChatDlg::OnBnClickedButtonSend()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData();
if(m_strMsg.IsEmpty()){
MessageBox(_T("不能发送空消息!")); return;
}
char *pBuf=new char[1025];
int nBufSize=1024;
int nLen=m_strMsg.GetLength();
int nRes=m_asClient.Send(LPCTSTR(m_strMsg),nLen*2);
if(nRes==SOCKET_ERROR){
AfxMessageBox(_T("消息发送失败!")); return;
}
if(m_bServer){
m_listMsg.AddString(_T("服务器发送的消息:"));
m_listMsg.AddString(m_strMsg);
}else{
m_listMsg.AddString(_T("客户机发送的消息:"));
m_listMsg.AddString(m_strMsg);
}
m_strMsg.Empty();
//UpdataData(FALSE);///////////////////////////////////////////////////error
UpdateData(FALSE);
}
void CEX_ChatDlg::OnReceive()
{
char *pBuf=new char[1025];
int nBufSize=1024;
CString strReceived;
int nRes=m_asClient.Receive(pBuf,nBufSize);
if(nRes==SOCKET_ERROR){
AfxMessageBox(_T("无法接收消息!")); return;
}
pBuf[nRes]=NULL;
strReceived=pBuf;
if(m_bServer){
m_listMsg.AddString(_T("来自客户机发送的消息:"));
m_listMsg.AddString(strReceived);
}else{
m_listMsg.AddString(_T("来自服务器发送的消息:"));
m_listMsg.AddString(strReceived);
}
}
展开
 我来答
有你的晴天12138
2014-04-11 · TA获得超过1001个赞
知道小有建树答主
回答量:305
采纳率:80%
帮助的人:212万
展开全部
1、这两个函数内,都new了数组,后面却没释放,会导致内存泄露;

2、m_asClient.Send(LPCTSTR(m_strMsg),nLen*2); 这里的发送长度怎么是 nLen * 2?

按你的意思应该是 nLen * sizeof(TCHAR) 吧?但你的Buffer都是定义的char型,所以请先确定你的工程是使用的UNICODE还是多字节。
3、不知道你的套接字设置的是阻塞模式还是非阻塞模式,是用的CAsyncSelect?
在接收一个套接字上的数据的时候,原始的recv函数的返回值一般要做如下判断:
(1) 返回值大于0,表示从套接字的接收缓冲区拷贝到了数据,无论是阻塞还是非阻塞,其值都可能小于你传入的Buffer长度;
(2) 返回值若等于0, 表示对端已关闭连接,TCP连接断开;
(3) 返回值若等于-1, 要看看WSAGetLastError的返回值,若为非阻塞套接字,若错误代码为WSAEWOULDBLOCK则表示缓冲区暂时没有数据,期待一会儿再收,若错误代码为其他值,则表示套接字错误;
更多追问追答
追问
为什么m_strMsg发送的是567!而pBuf接收到的只是5啊?求大神解答!谢谢
追答
你还没回答我上面提出的问题呀,不好解答。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
?>

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式