небольшая проблемка с сокетами...
От: arki  
Дата: 26.05.03 19:24
Оценка:
в debug режиме когда я подключаюсь к серверу он мне выкидывает ошибку:
Debug Assertion Failed!
и там три кнопочки: Стоп,Повтор,Пропустить.
Нажимаю Пропустить.. все прекрасно работает.
Но! когда комилишь релиз, то на этом месте программа просто вылетает! и все.

пробывал нажимать на повтор, он мне тыкает вот в такие строчки
файл sockcore.cpp


BOOL CAsyncSocket::Accept(CAsyncSocket& rConnectedSocket,
    SOCKADDR* lpSockAddr, int* lpSockAddrLen)
{
    ASSERT(rConnectedSocket.m_hSocket == INVALID_SOCKET);
    ASSERT(CAsyncSocket::FromHandle(INVALID_SOCKET) == NULL);

    CAsyncSocket::AttachHandle(INVALID_SOCKET, &rConnectedSocket);

    SOCKET hTemp = accept(m_hSocket, lpSockAddr, lpSockAddrLen);

    if (hTemp == INVALID_SOCKET)
    {.........
...


потом




BOOL CAsyncSocket::Socket(int nSocketType, long lEvent,
    int nProtocolType, int nAddressFormat)
{
    ASSERT(m_hSocket == INVALID_SOCKET);
    m_hSocket = socket(nAddressFormat,nSocketType,nProtocolType);
    if (m_hSocket != INVALID_SOCKET)
    {
        CAsyncSocket::AttachHandle(m_hSocket, this, FALSE);
        return AsyncSelect(lEvent);
    }
    return FALSE;
}



вот сам код:



#include <afxwin.h>
#include <afxsock.h>
#define CLIENTCONNECT 11111
#define RECEIVE 22222
#define EDIT1 311
#define EDIT3 313
#define LBOX1 411
#define EDIT2 312
#define EDIT4 314


//CMySocket

class CMySocket : public CSocket
{
public:
    CMySocket(){};
    virtual void OnAccept(int nErrorCode);
    virtual void OnReceive(int nErrorCode);
};

void CMySocket::OnReceive(int nErrorCode)
{
    AfxGetApp()->m_pMainWnd->SendMessage(RECEIVE);
    CSocket::OnReceive(nErrorCode);
}

void CMySocket::OnAccept(int nErrorCode)
{
    AfxGetApp()->m_pMainWnd->SendMessage(CLIENTCONNECT);
    CSocket::OnAccept(nErrorCode);
}

//CMainWnd

class CMainWnd : public CDialog
{
public:
    CMainWnd(CWnd *pParent=NULL);
    ~CMainWnd();
    virtual BOOL OnInitDialog(); 
    CMySocket m_pListenSocket;
    CMySocket m_pClientSocket;
    CMySocket m_pServerSocket;
    afx_msg void ClientAccept();
    afx_msg void Receive();
    SendMsg();
    Update();
    UpdateServ();
private:
    CString IP;
    CString name;
    int ServOK;
    CString buffer;
    CString temp;
    CString TextIn;
    CButton Btn1;
    CButton Btn2;
    CButton Btn3;
    CStatic stc1;
    CStatic stc2;
    CEdit Edt1;
    CEdit Edt3;
    CEdit Edt2;
    CEdit Edt4;
    BtnConnect();
    BtnServer();
    CString Text;
    DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CMainWnd,CDialog)
ON_COMMAND(211,BtnConnect)
ON_COMMAND(212,BtnServer)
ON_COMMAND(213,SendMsg)
ON_MESSAGE(CLIENTCONNECT,ClientAccept)
ON_MESSAGE(RECEIVE,Receive)
END_MESSAGE_MAP()

CMainWnd::Update()
{
    GetDlgItem(EDIT2);
    Edt2.GetWindowText(Text);
    TextIn="";
    Edt1.GetWindowText(TextIn);
    Text.Insert(555,name);
    Text.Insert(555,TextIn);
    Text.Insert(555,"\r\n");
    Edt2.SetWindowText(Text);
    Edt2.SendMessage(WM_VSCROLL,SB_BOTTOM,NULL);    
}

CMainWnd::UpdateServ()
{
    GetDlgItem(EDIT2);
    Edt2.GetWindowText(Text);
    TextIn=buffer;
    Text.Insert(555,TextIn);
    Text.Insert(555,"\r\n");
    Edt2.SetWindowText(Text);
    Edt2.SendMessage(WM_VSCROLL,SB_BOTTOM,NULL);    
}

CMainWnd::SendMsg()
{
    if (ServOK==1)
    {
        GetDlgItem(EDIT1);
        temp=name;
        Edt1.GetWindowText(TextIn);
        temp.Insert(555,TextIn);
        TextIn=temp;
        m_pServerSocket.Send(TextIn,TextIn.GetLength());    
        Update();
    };
    if (ServOK==0)
    {
        GetDlgItem(EDIT1);
        Edt1.GetWindowText(TextIn);
        temp=name;
        temp.Insert(555,TextIn);
        TextIn=temp;
        m_pClientSocket.Send(TextIn,TextIn.GetLength());
        Update();
    };
}

void CMainWnd::Receive()
{
    int nRead;
    char buff[4096];
    if (ServOK==1) nRead=m_pServerSocket.Receive(buff,4096);
    if (ServOK==0) nRead=m_pClientSocket.Receive(buff,4096);
    buff[nRead]=NULL;
    buffer=buff;
    UpdateServ();
}


void CMainWnd::ClientAccept()
{
    m_pListenSocket.Accept(m_pServerSocket);
}

CMainWnd::BtnConnect() //Кнопка коннент
{
    ServOK=0;
    Edt4.GetWindowText(name);
    name.Insert(555," said ");
    Edt3.GetWindowText(IP);
    m_pClientSocket.Connect(IP,9999);
    Edt4.SetReadOnly();
    Edt3.SetReadOnly();
    SetWindowText("Client");
}

CMainWnd::BtnServer() //Кнопка сервер
{
    ServOK=1;
    Edt4.GetWindowText(name);
    name.Insert(555," said ");
    Edt4.SetReadOnly();
    Edt3.SetReadOnly();
    m_pListenSocket.Listen();
    SetWindowText("Server");
}

CMainWnd::CMainWnd(CWnd* pParent) //конструткор главного диалогова окна
:CDialog(111,pParent)
{
}

CMainWnd::OnInitDialog()
{
    m_pListenSocket.Create(9999);
    m_pServerSocket.Create();
    m_pClientSocket.Create();
    SetWindowText("Main");
    //-------------------------- кнопки -----------------------------------------
    Btn1.Create("Connect...",WS_CHILD|WS_VISIBLE|SS_CENTER,CRect(383,125,463,150),this,211);
    Btn2.Create("Server",WS_CHILD|WS_VISIBLE|SS_CENTER,CRect(383,155,463,180),this,212);
    Btn3.Create("Send",WS_CHILD|WS_VISIBLE|SS_CENTER,CRect(370,310,470,330),this,213);
    //-------------------------- CEdit ------------------------------------------
    Edt1.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|ES_MULTILINE|ES_LEFT ,CRect(15,310,360,330),this,EDIT1);
    Edt2.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|ES_MULTILINE|ES_LEFT,CRect(15,10,360,290),this,EDIT2);
    Edt2.SetReadOnly();
    Edt3.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|ES_CENTER,CRect(365,40,480,60),this,EDIT3);
    Edt3.SetWindowText("127.0.0.1");
    Edt4.Create(WS_VISIBLE|WS_CHILD|WS_BORDER|ES_CENTER,CRect(365,95,480,115),this,EDIT4);
    Edt4.SetWindowText("User");
    //-------------------------- CStatic ----------------------------------------
    stc1.Create("Server's IP",WS_VISIBLE|WS_CHILD|SS_CENTER,CRect(385,15,465,40),this);
    stc2.Create("Nik Name",WS_VISIBLE|WS_CHILD|SS_CENTER,CRect(385,70,465,95),this);
    return TRUE;
}

CMainWnd::~CMainWnd()
{
}

//CApp

class CApp : public CWinApp
{
public:
    CApp(){};
    virtual BOOL InitInstance();
};

CApp::InitInstance()
{
    AfxSocketInit(); 
    CMainWnd dlg;
    m_pMainWnd= &dlg;
    dlg.DoModal();
    return FALSE;
};

CApp theApp;



и что это за ASSERT?
как найти и исправить ошибку?
Re: небольшая проблемка с сокетами...
От: Vamp Россия  
Дата: 27.05.03 06:30
Оценка:
ASSERT — специальный макрос, который в релиз-версии ничего не делает, а в дебаг — выводит отладочное сообщение. В твоем случае rConnectedSocket.m_hSocket = INVALID_SOCKET, а значит его использовать нельзя. Считается, что на этапе тестирования все ошибки подобного рода будут выявлены, поэтому в релиз-версии ASSERT не нужен. Разбирайся в коде и смотри, что у тебя не так с сокетами. В частности, проверяй результат всех функций, создающих сокеты.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: небольшая проблемка с сокетами...
От: Barzini  
Дата: 27.05.03 07:40
Оценка:
Здравствуйте, Vamp, Вы писали:

V>ASSERT — специальный макрос, который в релиз-версии ничего не делает, а в дебаг — выводит отладочное сообщение. В твоем случае rConnectedSocket.m_hSocket = INVALID_SOCKET, а значит его использовать нельзя. Считается, что на этапе тестирования все ошибки подобного рода будут выявлены, поэтому в релиз-версии ASSERT не нужен. Разбирайся в коде и смотри, что у тебя не так с сокетами. В частности, проверяй результат всех функций, создающих сокеты.


Прошу прощения, но по-моему, в данном случае сокет должен быть равен INVALID_SOCKET, любые другие значения приведут к ошибке, это делается для того, чтобы в функцию случайно не попал хэндлер уже используемого сокета. В rConnectedSocket.m_hSocket вернется значение после выполнения функции accept, отправку и получение информации потом следует производить через rConnectedSocket. Нужно просто проинициализировать rConnectedSocket. Посмотри внимательно код и все поймешь.
Re[3]: небольшая проблемка с сокетами...
От: Vamp Россия  
Дата: 27.05.03 10:38
Оценка:
Да, вы правы. Я не слишком внимательно посмотрел. Но сути макроса ASSERT это не меняет.

B>Прошу прощения, но по-моему, в данном случае сокет должен быть равен INVALID_SOCKET, любые другие значения приведут к ошибке, это делается для того, чтобы в функцию случайно не попал хэндлер уже используемого сокета. В rConnectedSocket.m_hSocket вернется значение после выполнения функции accept, отправку и получение информации потом следует производить через rConnectedSocket. Нужно просто проинициализировать rConnectedSocket. Посмотри внимательно код и все поймешь.
Да здравствует мыло душистое и веревка пушистая.
Re[4]: небольшая проблемка с сокетами...
От: arki  
Дата: 27.05.03 18:52
Оценка:
спасибо за ответы.. ошибку я нашел, в debug версии все работате хорошо, а вот в релизе просто вылетает =)

не знаю что делать

Visual C пишет: Unhandled exception in server.exe: 0xC0000005: Access Violation.

нажимаешь OK он тебе Assembler показывает.
Re[5]: небольшая проблемка с сокетами...
От: Barzini  
Дата: 28.05.03 07:02
Оценка:
Здравствуйте, arki, Вы писали:

A>спасибо за ответы.. ошибку я нашел, в debug версии все работате хорошо, а вот в релизе просто вылетает =)


A>не знаю что делать


A>Visual C пишет: Unhandled exception in server.exe: 0xC0000005: Access Violation.


A>нажимаешь OK он тебе Assembler показывает.


Посмотри внимательно, все ли объекты в твоей программе проинициализированы правильно. В дебаг-версии в непроиниченные локальные объекты попадает всякий мусор, а в релизе объект может заполниться нулями, сам по молодсти налетал на это кучу раз Так что в дебаге, например, указатель может быть != 0, а в релизе — наоборот, отсюда и access violation.
Re[5]: небольшая проблемка с сокетами...
От: Vamp Россия  
Дата: 28.05.03 07:50
Оценка:
См. статью
Автор(ы): Dr. Joseph M. Newcomer
Дата: 18.06.2001
Статья посвящена проблемам перехода с Debug-версии на Release-версию. Рассматриваются
типичные ошибки, которые могут не проявляться в отладочной версии, но проявляются в финальной.
Обсуждается вопрос "ошибок компилятора" и вопросы необходимости оптимизации и ее побочные эффекты.
В последней редакции добавлен раздел посвященный проблеме совместимости динамических библиотек.
.
Да здравствует мыло душистое и веревка пушистая.
Re[6]: небольшая проблемка с сокетами...
От: arki  
Дата: 30.05.03 15:16
Оценка:
о .. спасибо, статья как раз кстати.... помогла...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.