刚学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);这一句问题.
请问是什么原因?

解决方案 »

  1.   

    对啊,我Accept的参数是*clientsocket啊 。
      

  2.   

    *clientsocket是你CClientSocket类的对象,怎么是Socket?
      

  3.   

    如果你类中有Socket的话,应该clientsocket->Socket.
      

  4.   

    忘了说了,我的CClientsocket和CListeningSocket都是继承CSocket的 类
      

  5.   

    继不继承没有关系,问题是你没有定义SOCKET.你看msdn吧.Accept函数而且不止一个参数,有三个参数,都要填.
      

  6.   

    我看了,它后两个参数都可以默认为NULL的。应该不是这个问题吧?
      

  7.   

    Example CodeThe following example demonstrates the use of the accept function.
    #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哪?
      

  8.   

    listensocket这个指针变量未初始化。
      

  9.   

    我初始化了,在serverDlg的OnInitDialog中我写了 
    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;同样的错误。
    其实这个程序就是简单的一个聊天的服务器程序,我基本是根据书上的程序写的,不知怎么会出现这种情况。
      

  10.   

    我看LZ是只发了一帖。你调试程序看一下,listensocket变量的值,在出错时应该是0xcdcdcdcd,如果你确实初始化了,看一下是什么时候变成这个值的。
      

  11.   

    也可能是有内存越界破坏了listensocket。
    单步调试看一下,注意指针的变化。
      

  12.   

    发现了,是m_pDlg问题,这一句listensocket=new CListeningSocket(this); ,我觉得会把m_pDlg赋值 ,但还是不行,我又加了句listensocket.m_pDlg=this就行了,不知为什么。