孙鑫vc++ 异步套接字 编程如下代码:(在VC++6.0中编译,执行没问题,发送接收都正常)
接收时,消息处理:void CAsyncDlg::OnSock(WPARAM wParam,LPARAM lParam)
{
switch (LOWORD(lParam))
{
case FD_READ:
WSABUF wsabuf;
wsabuf.buf=new char[200];
wsabuf.len=200; DWORD dwRead;
DWORD dwFlag=0; /////
SOCKADDR_IN addrRecv;
int len=sizeof(SOCKADDR); ///// if (SOCKET_ERROR==WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,(SOCKADDR*)&addrRecv,&len,NULL,NULL))
{
MessageBox("接收数据失败");
return ;
} CString str,strTemp; str.Format("%s说 : %s",inet_ntoa(addrRecv.sin_addr),wsabuf.buf);
str=str+"\r\n";
GetDlgItemText(IDC_EDIT_RECV,strTemp);
str=str+strTemp;
SetDlgItemText(IDC_EDIT_RECV,str); break;
}
}
发送时:void CAsyncDlg::OnBtnSend()
{
// TODO: Add your control notification handler code here
CString str;
GetDlgItemText(IDC_EDIT_SEND,str);
int len;
len=str.GetLength(); ///// WSABUF wsabuf;
wsabuf.buf=str.GetBuffer(len);
wsabuf.len=len+1; ///// DWORD dwIP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
SOCKADDR_IN addrSend;
addrSend.sin_addr.S_un.S_addr=htonl(dwIP);
addrSend.sin_family=AF_INET;
addrSend.sin_port=htons(6000); DWORD dwSend; if (SOCKET_ERROR==WSASendTo(m_socket,&wsabuf,1,&dwSend,0,(SOCKADDR*)&addrSend,sizeof(SOCKADDR),NULL,NULL))
{
MessageBox("数据发送失败");
return;
}
SetDlgItemText(IDC_EDIT_SEND,"");
}问题:
我把它,改写到vs2008中,就有问题了。
接收:LRESULT CAsyncDlg::OnSock(WPARAM wParam, LPARAM lParam)
{
switch(LOWORD(lParam))
{
case FD_READ:
WSABUF wsabuf;
wsabuf.buf=new char[200];
wsabuf.len=200; SOCKADDR_IN addrRecv;
int len=sizeof(SOCKADDR); DWORD dwRecv;
DWORD dwFlag=0; if (SOCKET_ERROR==WSARecvFrom(m_socket,&wsabuf,1,&dwRecv,&dwFlag,(SOCKADDR*)&addrRecv,&len,NULL,NULL))
{
MessageBox(_T("WSARecvFrom"),_T("ERROR"));
return 0;
} CString str,strTemp;
str.Format(_T("%s说 : %s"),inet_ntoa(addrRecv.sin_addr),wsabuf.buf);
str=str+_T("\r\n"); GetDlgItemText(IDC_EDIT_RECV,strTemp);
strTemp=str+strTemp;
SetDlgItemText(IDC_EDIT_RECV,strTemp); break;
}// return LRESULT();
return 1;
}
发送:void CAsyncDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
GetDlgItemText(IDC_EDIT_SEND,str);
// str=str+_T("\0");
int len;
len=str.GetLength(); WSABUF wsabuf;
wsabuf.buf=(CHAR *)str.GetBuffer(len);
wsabuf.len=len*2+1; //本来是和VC++6.0中一样的"wsabuf.len=len+1;",看到"Buffer too small"后改成现在这样还是 错MessageBox(LPCTSTR(wsabuf.buf),_T(""));
DWORD dwIP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP); SOCKADDR_IN addrSend;
addrSend.sin_addr.S_un.S_addr=htonl(dwIP);
addrSend.sin_family=AF_INET;
addrSend.sin_port=htons(6000);MessageBox(_T("1"),_T("")); DWORD dwSend;
try
{
if (SOCKET_ERROR==WSASendTo(m_socket,&wsabuf,1,&dwSend,0,(SOCKADDR*)&addrSend,sizeof(SOCKADDR),NULL,NULL)) /////--------①
{
MessageBox(_T("WSASendTo failed"),_T("ERROR"));
return;
}
}
catch (CException* e)
{
TCHAR tc[255];
e->GetErrorMessage(tc,255);
AfxMessageBox(tc);
}
MessageBox(_T("2"),_T("")); SetDlgItemText(IDC_EDIT_SEND,_T(""));
}
环境:虚拟机 windows server 2008 、vs2008现象:
1、在vs界面直接按"启动调试(小三角)"运行,输入“127.0.0.1”,不报错,能发送接收数据,但是接收到得数据:“㈱⸷⸰⸰1멸몭몭몭몭몭说 : 111촀췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍﷽﷽ꮫꮫꮫꮫﻮﻮ”(发送时数据为"111") 。请问为何??
2、在程序目录,找到相应exe,直接运行,,输入“127.0.0.1”,发送信息为随手输几个字母,点击发送,报错:
“Debug Assertion Failed!Program:C:\.................\Debug\Async.exe
File:f:\dd\vctools\crt_bld\self_x86\crt\src\vswprint.c
Line:280Expression:("Buffer too small",0)For information on how your program can cause an assertion failed,see the Visual C++ documentation on asserts.(Press Retryto debug the application)”
发现应该是程序中①处引起,改了"wsabuf.len"还是这样,加了如上代码的try catch还是这样。请问为何??如上错误信息中"File:f:\dd\vctools\crt_bld\self_x86\crt\src\vswprint.c"此句是干嘛的?我虚拟机中只有C盘,这句是啥意思?小弟菜鸟,请大家指点。
接收时,消息处理:void CAsyncDlg::OnSock(WPARAM wParam,LPARAM lParam)
{
switch (LOWORD(lParam))
{
case FD_READ:
WSABUF wsabuf;
wsabuf.buf=new char[200];
wsabuf.len=200; DWORD dwRead;
DWORD dwFlag=0; /////
SOCKADDR_IN addrRecv;
int len=sizeof(SOCKADDR); ///// if (SOCKET_ERROR==WSARecvFrom(m_socket,&wsabuf,1,&dwRead,&dwFlag,(SOCKADDR*)&addrRecv,&len,NULL,NULL))
{
MessageBox("接收数据失败");
return ;
} CString str,strTemp; str.Format("%s说 : %s",inet_ntoa(addrRecv.sin_addr),wsabuf.buf);
str=str+"\r\n";
GetDlgItemText(IDC_EDIT_RECV,strTemp);
str=str+strTemp;
SetDlgItemText(IDC_EDIT_RECV,str); break;
}
}
发送时:void CAsyncDlg::OnBtnSend()
{
// TODO: Add your control notification handler code here
CString str;
GetDlgItemText(IDC_EDIT_SEND,str);
int len;
len=str.GetLength(); ///// WSABUF wsabuf;
wsabuf.buf=str.GetBuffer(len);
wsabuf.len=len+1; ///// DWORD dwIP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
SOCKADDR_IN addrSend;
addrSend.sin_addr.S_un.S_addr=htonl(dwIP);
addrSend.sin_family=AF_INET;
addrSend.sin_port=htons(6000); DWORD dwSend; if (SOCKET_ERROR==WSASendTo(m_socket,&wsabuf,1,&dwSend,0,(SOCKADDR*)&addrSend,sizeof(SOCKADDR),NULL,NULL))
{
MessageBox("数据发送失败");
return;
}
SetDlgItemText(IDC_EDIT_SEND,"");
}问题:
我把它,改写到vs2008中,就有问题了。
接收:LRESULT CAsyncDlg::OnSock(WPARAM wParam, LPARAM lParam)
{
switch(LOWORD(lParam))
{
case FD_READ:
WSABUF wsabuf;
wsabuf.buf=new char[200];
wsabuf.len=200; SOCKADDR_IN addrRecv;
int len=sizeof(SOCKADDR); DWORD dwRecv;
DWORD dwFlag=0; if (SOCKET_ERROR==WSARecvFrom(m_socket,&wsabuf,1,&dwRecv,&dwFlag,(SOCKADDR*)&addrRecv,&len,NULL,NULL))
{
MessageBox(_T("WSARecvFrom"),_T("ERROR"));
return 0;
} CString str,strTemp;
str.Format(_T("%s说 : %s"),inet_ntoa(addrRecv.sin_addr),wsabuf.buf);
str=str+_T("\r\n"); GetDlgItemText(IDC_EDIT_RECV,strTemp);
strTemp=str+strTemp;
SetDlgItemText(IDC_EDIT_RECV,strTemp); break;
}// return LRESULT();
return 1;
}
发送:void CAsyncDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
GetDlgItemText(IDC_EDIT_SEND,str);
// str=str+_T("\0");
int len;
len=str.GetLength(); WSABUF wsabuf;
wsabuf.buf=(CHAR *)str.GetBuffer(len);
wsabuf.len=len*2+1; //本来是和VC++6.0中一样的"wsabuf.len=len+1;",看到"Buffer too small"后改成现在这样还是 错MessageBox(LPCTSTR(wsabuf.buf),_T(""));
DWORD dwIP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP); SOCKADDR_IN addrSend;
addrSend.sin_addr.S_un.S_addr=htonl(dwIP);
addrSend.sin_family=AF_INET;
addrSend.sin_port=htons(6000);MessageBox(_T("1"),_T("")); DWORD dwSend;
try
{
if (SOCKET_ERROR==WSASendTo(m_socket,&wsabuf,1,&dwSend,0,(SOCKADDR*)&addrSend,sizeof(SOCKADDR),NULL,NULL)) /////--------①
{
MessageBox(_T("WSASendTo failed"),_T("ERROR"));
return;
}
}
catch (CException* e)
{
TCHAR tc[255];
e->GetErrorMessage(tc,255);
AfxMessageBox(tc);
}
MessageBox(_T("2"),_T("")); SetDlgItemText(IDC_EDIT_SEND,_T(""));
}
环境:虚拟机 windows server 2008 、vs2008现象:
1、在vs界面直接按"启动调试(小三角)"运行,输入“127.0.0.1”,不报错,能发送接收数据,但是接收到得数据:“㈱⸷⸰⸰1멸몭몭몭몭몭说 : 111촀췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍췍﷽﷽ꮫꮫꮫꮫﻮﻮ”(发送时数据为"111") 。请问为何??
2、在程序目录,找到相应exe,直接运行,,输入“127.0.0.1”,发送信息为随手输几个字母,点击发送,报错:
“Debug Assertion Failed!Program:C:\.................\Debug\Async.exe
File:f:\dd\vctools\crt_bld\self_x86\crt\src\vswprint.c
Line:280Expression:("Buffer too small",0)For information on how your program can cause an assertion failed,see the Visual C++ documentation on asserts.(Press Retryto debug the application)”
发现应该是程序中①处引起,改了"wsabuf.len"还是这样,加了如上代码的try catch还是这样。请问为何??如上错误信息中"File:f:\dd\vctools\crt_bld\self_x86\crt\src\vswprint.c"此句是干嘛的?我虚拟机中只有C盘,这句是啥意思?小弟菜鸟,请大家指点。
解决方案 »
- 昨天帮助过我的kusey,过来接分,昨天结贴时忘记给你加分了,真是对不起。
- 求人编写一个软件
- 在另外一个线程访问对话框中的控件
- 帮我看一下这是什么问题!
- 这是我程序里面控制工具条切换的一个函数的代码,谁能解释一下为什么要做那么多判断?
- 俺今天阳历生日!散分!happy birthday to myself!
- 用VC连接MYSQL
- createprocess成功后怎么中途退出进程sos
- 请教:如何讲内存池的内存块初始化给一个确定的对象,即如何对虚函数指针vptr初始化,详见内容
- 我想做一个局域网下的语音聊天软件,大家来谈医坛怎么实现吧!越详细越好!
- 如何在程序运行起来之后,改变CAboutDlg对话框中一个控件的值
- A计算机和B计算机用一根网线互联,但此网线只传有用数据,就像485网络一样,而其他一概屏蔽。
CString str;
GetDlgItemText(IDC_EDIT_SEND,str);
WSABUF wsabuf;
wsabuf.buf=(char*)(LPCTSTR)str;
wsabuf.len=(str.GetLength()+1)*sizeof(TCHAR);
即 应该是"str.Format(_T("%s说 : %s"),inet_ntoa(addrRecv.sin_addr),wsabuf.buf);"这一句,怎么改?? 我改为 "str.Format(_T("%s 说 : %s"),(char*)(LPCTSTR)inet_ntoa(addrRecv.sin_addr),wsabuf.buf);"--->还是那样。
str.Format(_T("%s 说 : %s"),(LPCTSTR)inet_ntoa(addrRecv.sin_addr),(LPCTSTR)wsabuf.buf);
F应该是你虚拟机内的盘符
不对 还是前半句不对
虚拟机 一个C盘、软盘为A、DVD光驱为D,其他没了
就是这个东东是在pdb文件里保存的,微软编译时自动生成的。
你调试时它找不到相应的文件后,就自动提示编译时的环境。
能行自然可联想到CSTRING自动帮你把Multibyte转成Unicode了还有什么疑问啊