刚学MFC不久,向大家请教一个问题,我用CSocket编写的一个服务器端程序,我在我的对话框类serverDlg.h中定义了一个CListeningSocket*listensocket和CClientSocket*clientsocket. CListeningSocket和CClientSocket为我自定义的两个类.
而且在CListeningSocket.h中定义了sererDlg*m_pDlg.在accept时,
void CListeningSocket::OnAccept(int nErrorCode)
{
if(m_pDlg)
{
m_pDlg->ProcessPendingAccept(); //调用serverDlg中的函数
}
}void serverDlg::ProcessPendingAccept()
{
clientsocket=new CClientSocket;
listensocket->Accept(*clientsocket);
}但是执行了时候总是出现Unhandled exception at 0x00416ab3 in server.exe: 0xC0000005: Access violation reading location 0xcdcdce49.
指示是listensocket->Accept(*clientsocket);这一句问题.
请问是什么原因?
而且在CListeningSocket.h中定义了sererDlg*m_pDlg.在accept时,
void CListeningSocket::OnAccept(int nErrorCode)
{
if(m_pDlg)
{
m_pDlg->ProcessPendingAccept(); //调用serverDlg中的函数
}
}void serverDlg::ProcessPendingAccept()
{
clientsocket=new CClientSocket;
listensocket->Accept(*clientsocket);
}但是执行了时候总是出现Unhandled exception at 0x00416ab3 in server.exe: 0xC0000005: Access violation reading location 0xcdcdce49.
指示是listensocket->Accept(*clientsocket);这一句问题.
请问是什么原因?
#include <winsock2.h>
#include <stdio.h>int main(void) { //----------------------
// Initialize Winsock.
WSADATA wsaData;
int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != NO_ERROR) {
printf("Error at WSAStartup()\n");
return 1;
} //----------------------
// Create a SOCKET for listening for
// incoming connection requests.
SOCKET ListenSocket;
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (ListenSocket == INVALID_SOCKET) {
printf("Error at socket(): %ld\n", WSAGetLastError());
WSACleanup();
return 1;
} //----------------------
// The sockaddr_in structure specifies the address family,
// IP address, and port for the socket that is being bound.
sockaddr_in service;
service.sin_family = AF_INET;
service.sin_addr.s_addr = inet_addr("127.0.0.1");
service.sin_port = htons(27015); if (bind( ListenSocket,
(SOCKADDR*) &service,
sizeof(service)) == SOCKET_ERROR) {
printf("bind() failed.\n");
closesocket(ListenSocket);
WSACleanup();
return 1;
} //----------------------
// Listen for incoming connection requests.
// on the created socket
if (listen( ListenSocket, 1 ) == SOCKET_ERROR) {
printf("Error listening on socket.\n");
closesocket(ListenSocket);
WSACleanup();
return 1;
} //----------------------
// Create a SOCKET for accepting incoming requests.
SOCKET AcceptSocket;
printf("Waiting for client to connect...\n"); //----------------------
// Accept the connection.
AcceptSocket = accept( ListenSocket, NULL, NULL );
if (AcceptSocket == INVALID_SOCKET) {
printf("accept failed: %d\n", WSAGetLastError());
closesocket(ListenSocket);
WSACleanup();
return 1;
} else
printf("Client connected.\n");
// No longer need server socket
closesocket(ListenSocket); WSACleanup();
return 0;msdn示例代码.其中有SOCKET ListenSocket;
你的Socket哪?
listensocket=new CListeningSocket(this);
listensocket->Create(1234);
listensocket->Listen();
我又在网上搜了下,好象是两个类交叉引用的内存引用问题,我把ProcessPendingAccept的内容全部放到CListeningSocket::OnAccept中变为
void CListeningSocket::OnAccept(int nErrorCode)
{
CClientSocket *sock=new CClientSocket();
Accept(*sock);
m_pDlg->clientsocket=sock; CSocket::OnAccept(nErrorCode);
}
还是显示m_pDlg->clientsocket=sock;同样的错误。
其实这个程序就是简单的一个聊天的服务器程序,我基本是根据书上的程序写的,不知怎么会出现这种情况。
单步调试看一下,注意指针的变化。