ClientSocket.h:
class CClientSocket : public CSocket
{
public:
CClientSocket();
virtual ~CClientSocket();
public:
void * m_pBuff;
protected:
virtual void OnReceive(int nErrorCode);
};ClientSocket.cpp:
CClientSocket::CClientSocket()
{
m_pBuff = (void *) new char(4096); //4k
}
void CClientSocket::OnReceive(int nErrorCode)
{
Receive(m_pBuff, 128); //如果128改为64则正常。如果为128,后面的语句就会报错:0x77f9193c处未处理异 常:用户断点。也就是在单步执行完下面的语句后就进入系统代码,就报错
CSocket::OnReceive(nErrorCode);
}
我分配的是4K的内存,为什么128个字节就报错??
开发环境:.net2003/vc++/mfc/mfc application/dialog
class CClientSocket : public CSocket
{
public:
CClientSocket();
virtual ~CClientSocket();
public:
void * m_pBuff;
protected:
virtual void OnReceive(int nErrorCode);
};ClientSocket.cpp:
CClientSocket::CClientSocket()
{
m_pBuff = (void *) new char(4096); //4k
}
void CClientSocket::OnReceive(int nErrorCode)
{
Receive(m_pBuff, 128); //如果128改为64则正常。如果为128,后面的语句就会报错:0x77f9193c处未处理异 常:用户断点。也就是在单步执行完下面的语句后就进入系统代码,就报错
CSocket::OnReceive(nErrorCode);
}
我分配的是4K的内存,为什么128个字节就报错??
开发环境:.net2003/vc++/mfc/mfc application/dialog
char Enc_data[20000];
while ( 0 != read(sockfd, Enc_data+datalen, 1))
{
datalen++;
}我猜测可能一共不到128个
把 Receive(m_pBuff, 128); 放到 CSocket::OnReceive(nErrorCode); 后看看,
如果还出错就用WSAGetLastError()查看返回值,一目了然
Example:void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is
// derived from CAsyncSocket
{
static int i=0; i++; TCHAR buff[4096];
int nRead;
nRead = Receive(buff, 4096);
switch (nRead)
{
case 0:
Close();
break;
case SOCKET_ERROR:
if (GetLastError() != WSAEWOULDBLOCK)
{
AfxMessageBox ("Error occurred");
Close();
}
break;
default:
buff[nRead] = 0; //terminate the string
CString szTemp(buff);
m_strRecv += szTemp; // m_strRecv is a CString declared
// in CMyAsyncSocket
if (szTemp.CompareNoCase("bye") == 0 ) ShutDown();
}
CAsyncSocket::OnReceive(nErrorCode);
}
可以参考下这个。
用WSAGetLastError()好像不行呀? 是执行到系统代码dbgrpt.c(Debug CRT Reporting Functions)出错的
这个问题有些怪呀,我的代码也很简单呀,基本上就是上面的代码
我参考了下你的做法,但还是这样
nRead = Receive(buff, 4096);
但得到的nRead 却是1053,如果将4096改为>=1053的值,则nRead 都是1053,如果将4096改为<1053,则nRead 是实际值,不知道怎么回事情??
是不是跟服务器端返回的数据有关系??
不知道为什么,Receive第二个参数如果大于64,则执行完CSocket::OnReceive(nErrorCode); 后进入系统代码就会报错,而Receive第二个参数如果小于或等于64,则不会报错请问高手们这是怎么回事情呀?
nRead = Receive(buff, 4096);
nRead为1053是因为服务器发给我了个结构体是1052个字节,再加上1个字节的数据,所以为1053
不知道为什么,Receive第二个参数如果大于64,则执行完CSocket::OnReceive(nErrorCode); 后进入系统代码就会报错:0x77f9193c处未处理异常:用户断点。而Receive第二个参数如果小于或等于64,则不会报错 请问高手们这是怎么回事情呀?
m_pBuff = (void *) new char(4096); //4k ,应该为:
m_pBuff = (void *) new char[4096]; //4k
把括号写错了