CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 5 of 5

Thread: Big problem

  1. #1
    Join Date
    Nov 1999
    Location
    Romania
    Posts
    51

    Big problem

    What is wrong with my code:

    The problem is that:
    -when I run my program after a connection has been served it crashes but when I run it with F8 it works very fine.



    Dim IndexClient as Long
    Dim TotalClients as Long
    Dim Connection as new ADODB.Connection
    Dim Command as new ADODB.Command
    Dim Recordset(20) as new ADODB.Recordset

    private Sub Form_Load()
    Clients.Clear
    Connection.Open "DSN=Oracle;UID=userid;PWD=password"
    Server(0).Listen
    for i = 1 to 20
    Load Server(i)
    next i
    End Sub

    private Sub Form_Unload(Cancel as Integer)
    If Connection.State <> adStateClosed then
    Connection.Close
    End If
    Clients.Clear
    for i = 1 to IndexClient
    If Server(i).State <> sckClosed then
    Server(i).Close
    Unload Server(i)
    End If
    next i

    End Sub

    private Sub Server_Close(Index as Integer)
    'un client se deconecteaza si trebuie sa-l sterg din lista
    Server(Index).Close
    Clients.Clear
    for i = 1 to 20
    If Server(i).State <> sckClosed then
    Clients.AddItem Server(i).RemoteHostIP
    End If
    next i
    IndexClient = IndexClient - 1
    End Sub

    private Sub Server_ConnectionRequest(Index as Integer, byval requestID as Long)
    TotalClients = TotalClients + 1
    Total = "Total clients: " & TotalClients
    'se conecteaza un client
    IndexClient = IndexClient + 1
    for i = 1 to IndexClient
    If Server(i).State = sckClosed then
    Server(i).LocalPort = 0
    Server(i).Accept requestID
    Exit for
    End If
    next i
    'If i = IndexClient then
    ' Server(IndexClient).LocalPort = 0
    ' Server(IndexClient).Accept requestID
    'End If
    Clients.AddItem Server(IndexClient).RemoteHostIP

    End Sub

    private Sub Server_DataArrival(Index as Integer, byval bytesTotal as Long)
    'un client cere date trimitand un string
    'analizez stringul si ii trimit datele sau eroare
    Dim Data as string
    Dim mumu 'nu stiu de ce
    Server(Index).GetData Data
    If IsNumeric(Data) = true then
    'stringul trimis este cod de articol sau cod de bare
    mumu = Cod_Articol(Index, Data)
    else
    'stringul trimis este denumire de articol;ex: coca-cola
    mumu = Denumire_Articol(Index, Data)
    End If
    End Sub

    private Function Cod_Articol(byval Index as Integer, byval CodArticol as string)
    CodArticol = Trim(CodArticol)
    Command.ActiveConnection = Connection

    If len(CodArticol) = 8 And mid(CodArticol, 1, 1) = "2" then
    CodArticol = mid(CodArticol, 2, 6)
    End If

    If len(CodArticol) > 8 And mid(CodArticol, 1, 2) = "28" then
    Command.CommandText = "select art_no from barcode where barcode like " & mid(CodArticol, 1, 7)
    Recordset(Index).Open Command, , adOpenStatic, adLockOptimistic, adCmdText
    If Recordset(Index).RecordCount >= 0 then
    CodArticol = Recordset(Index).Fields(0)
    else
    Server(Index).SendData "ERR"
    GoTo sfarsit
    End If
    End If

    If len(CodArticol) > 8 then 'este cod de bare normal
    Command.CommandText = "select art_no from barcode where barcode like " & CodArticol
    Recordset(Index).Open Command, , adOpenStatic, adLockOptimistic, adCmdText
    If Recordset(Index).RecordCount >= 0 then
    CodArticol = Recordset(Index).Fields(0)
    else
    Server(Index).SendData "ERR"
    GoTo sfarsit
    End If
    End If

    If Recordset(Index).State <> adStateClosed then
    Recordset(Index).Close
    End If

    Command.CommandText = "select * from cioprica_symbol where art_no=" & CodArticol
    Recordset(Index).Open Command, , adOpenStatic, adLockOptimistic, adCmdText

    If Recordset(Index).RecordCount > 0 then
    for i = 0 to 15
    Server(Index).SendData Recordset(Index).Fields(i) & "@"
    next i
    else
    Server(Index).SendData "ERR"
    End If
    sfarsit:
    Recordset(Index).Close
    End Function

    public Function Denumire_Articol(byval Index as Integer, byval DenArticol as string)
    Command.ActiveConnection = Connection
    DenArticol = UCase(DenArticol)
    Command.CommandText = "select art_no,descr from article where descr like '%" & Trim(DenArticol) & "%'"
    Recordset(Index).Open Command, , adOpenStatic, adLockOptimistic, adCmdText
    If Recordset(Index).RecordCount > 0 And Recordset(Index).RecordCount <= 50 then
    Recordset(Index).MoveFirst
    for i = 1 to Recordset(Index).RecordCount
    Server(Index).SendData Recordset(Index).Fields(0) & "@" & Recordset(Index).Fields(1) & "@"
    Recordset(Index).MoveNext
    next i
    else
    If Recordset(Index).RecordCount > 50 then
    Server(Index).SendData "SPC"
    else
    Server(Index).SendData "ERR"
    End If
    End If
    Recordset(Index).Close
    End Function






    Thanks


  2. #2
    Join Date
    Jul 2000
    Location
    Milano, Italy
    Posts
    7,726

    Re: Big problem

    Maybe I am a little tired, and I did not look carefully at all your code: as I saw the following:
    Dim Connection as new ADODB.Connection
    Dim Command as new ADODB.Command
    Dim Recordset(20) as new ADODB.Recordset

    I went down fast looking for (but not finding) the following:

    set connection = nothing
    set command= nothing
    set Recordset(i)= nothing
    may it be?...


    Special thanks to Lothar "the Great" Haensler. Come back soon, you Guru.
    ...at present time, using mainly Net 4.0, Vs 2010



    Special thanks to Lothar "the Great" Haensler, Chris Eastwood , dr_Michael, ClearCode, Iouri and
    all the other wonderful people who made and make Codeguru a great place.
    Come back soon, you Gurus.

  3. #3
    Join Date
    Nov 1999
    Location
    Romania
    Posts
    51

    Re: Big problem

    Thanks a lot.
    I resolved the problem.
    The error was not in the server it was in the client application.
    I had to put an minimal delay (Sleep(10) in the client application.


  4. #4
    Join Date
    Jul 2000
    Location
    Milano, Italy
    Posts
    7,726

    Re: Big problem

    It sounds strange...You can make it wait untill connection has established
    do while connection.state <> 1
    'make a control connection is not ending for other causes
    if connection.state > 3 'do not remember exactly: have a look in MSDN
    'exit your sub knowing no connection has established
    ...
    end if

    loop
    'connecttion established...
    ...
    Hope this help

    Special thanks to Lothar "the Great" Haensler. Come back soon, you Guru.
    ...at present time, using mainly Net 4.0, Vs 2010



    Special thanks to Lothar "the Great" Haensler, Chris Eastwood , dr_Michael, ClearCode, Iouri and
    all the other wonderful people who made and make Codeguru a great place.
    Come back soon, you Gurus.

  5. #5
    Join Date
    Nov 1999
    Location
    Romania
    Posts
    51

    Re: Big problem

    The client code was the following (in C++):
    connect(...);
    send(...);
    recv(...);
    closesocket();
    The problem was that when the client began to receive the data the recv(...) function returned and the client began the process for closing the connection.In this time the server was sending data and when it receives the closing message from client the Server_Close(...) function was called and the connection was closed during that the server was still tring to send data using that socket.
    In debug mode the Server_Close(...) function was executed after I had finished executing the sending function and that why in debug mode everythig worked fine.
    Instead using Sleep(10) in client program I can try setting the buffer size of Windows Sockets to 0.
    Thanks again.


Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured