|
Looking at this piece of code, i got the shivers.
Well it is MFC code so I shouldn't be surprised.
Use the call stack to get back to get to your code where the real problem probably occurred.
Check for already delete of freed up chunks of memory.
codito ergo sum
|
|
|
|
|
The problem has been solved. It turns out that I was allocating an incorrect amount of memory for three variables. To sum up,
Old:
double *var1 = new double[20];
Changed to:
double *var1 = new double[correctInt];
Regards,
Mike
|
|
|
|
|
Hi Guys,
Some background info:
OS - Windows XP Home SP2
IDE - Visual Studio 2002 .NET
I am writing a small client/server application to send/receive data over a network based on WSASocket. Everything is working as the client connects to the server and data is passed successfully between them, except for one issues...
At this stage I am running both the server and client on my development PC and am connecting to 127.0.0.1 or the network ip of 192.168.1.1
Sometimes (about 1 in 10) the establishment of the connection takes a long time, up to 30 seconds. I have now traced the server and client programs to death and now came to the conclusion that the actual firing/receiving of the FD_ACCEPT event sometimes takes very long, for now apparant reason, although usually the FD_ACCEPT is fired within 100ms.
I've traced out the applications to the point where I can show the actual timestamps of the connect function call and the corresponding reception of the FD_ACCEPT event.
To further confuse things it seems that this problem never occurs when I disconnect the network cable. Without the cable I've done about 50 connection tests and they all work fine. When I plug the network cable into the nic every now and then the connection takes an age to establish.
Does anybody have any idea what is going on here ? Is it a nic driver problem ? Is it a winsock problem ? Is it a Windows problem ? Any other ideas ?
Thanks
OD
|
|
|
|
|
What method are you using to obtain the FD_ACCEPT notification? Window message? Event?
Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
Hi Mark,
Here is the code :
TRACE("\nCheckEvents 1 - %s", CDateTimeTools::TimeString());
if (WSAWaitForMultipleEvents(1, &m_hEvents, FALSE, 60000, TRUE) >= WSA_WAIT_EVENT_0)
{
TRACE("\nCheckEvents 2 - %s", CDateTimeTools::TimeString());
WSAResetEvent(m_hEvents);
WSANETWORKEVENTS sEvents = {0};
if (!WSAEnumNetworkEvents(m_hSocket, m_hEvents, &sEvents))
etc, etc, etc ...
With the time difference between TRACE 1 and 2 being in the region of 30 seconds when things go wrong !
Cheers
|
|
|
|
|
IS that code used after the connect call()?
Also, you can remove the WSAResetEvent(m_hEvents); call. WSAEnumNetworkEvents() will do the
reset for you.
Regardless, 30 seconds is typically the default timeout for sockets searching for a remote
address. In the client, make sure the address struct for the server address is initialized
correctly. If connect() was finding the remote address - even if a server wasn't listening on
the connect port - it would fail in a few seconds max, not 30 seconds.
Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
Jip, that is the code that waits for events on the server side. The point is still that every once in a while only the problem occurs that the FD_ACCEPT event is fired after about 30 seconds and though even though it is slow, the connection is then accepted and functions fine onwards.
Cheers
|
|
|
|
|
Hmmm not likely related to the code I've seen so far...
od@ananzi.co.za wrote: and am connecting to 127.0.0.1 or the network ip of 192.168.1.1
If you use "ipconfig" from a command prompt, what's the IP address of your machine?
Is it 192.168.1.1? That's always been my LAN router address.
Can you post the code that builds the sockaddr for both the connect() call on the client and the
bind() call on the server?
I'm not sure why it would be slow only sometimes...the 30 seconds time still says
network/addressing to me...
Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
Haven't seen this problem in my networking applications.
Additionally to Mark's comments: The only things I can guess is that your event handling may has a problem -or- your connect call is not IP based and the DNS-resolution for a hostname blocks a while. The server socket should get the FD_ACCEPT practically immediately inside the LAN (<50ms).
|
|
|
|
|
I haven't been able to make any headway as to what the problem/cause is, but some other thoughts ...
Although the application is running on my PC locally, my PC is connected on a nationwide VPN over ADSL. At this stage I am thinking that maybe somehow the routing tables in my tcp/ip stack gets screwed/reset/cleared and that the connection attempt then first "goes out" onto the VPN, before being handled by my application anyway.
I am going to try and snoop the network packets at some stage to try and verify my guess.
Cheers
|
|
|
|
|
Just checking one thing... are you working IP-based or hostname-based in your connect call?
|
|
|
|
|
I have tried both in my connect call, ip and hostname, and both does the slow connect thing without any discernable difference in the frequency of the problem appearing.
|
|
|
|
|
Sorry out of generic ideas, this must not happen! Have a good look at your networking core and try to stress test it isolated from application logic. If it is not a private/research project your are working one I would even consider using an existing network class (CAsyncSocket, IpWorks, etc).
|
|
|
|
|
Hi Moak. I'm out of ideas as well, except that I can now confirm that this problem does not occur when the application are running on a "pure" lan, i.e. no gateways/breakouts/links/etc to our VPN. It is only when I run the applications on PC's that are connected to the VPN that this problem occurs.
But my most technical response to the problem no is: Go Figure !
|
|
|
|
|
Hmmm, sounds like trouble! How about using a different networking library? If you search this forum you will find some suggestions (CAsyncNetwork, IpWorks, etc).
/M
PS: In case you are not sure which to use... feel free to try mine, follow link from my user page and download the SDK
|
|
|
|
|
Err, which link would that be ?
|
|
|
|
|
od@ananzi.co.za wrote: Err, which link would that be ?
sorry for not answering, I was on a holiday. You get a user's page with the "person" icon next to a nickname (here a direct link to mine).
|
|
|
|
|
I am having a problem reading binary files.
Basically, everything works fine as long as the byte I read from the binary file is not a 0x00 byte. For example, reading the following (in hex): A0, 30, C0, C0 ... works fine.
But, reading: A0, 34, 03, 00 ... does not work fine.
When I concatenate the strings, instead of sticking "rec" at the end of "data", it concatenates it BEFORE the end of "data" - I assume this is so because one of the bytes I read (00) is treated like '\0' (null). How do I fix this? I have tried using unsigned chars, but that didn't work, I can't use read with them. The string/char array MUST contain everything I read from the binary file (even 0x00), so it can be like "somebyteshere0x00morebyteshere" which is why i need "rec" added to the END of "data", even if "data" contains nulls before its end.
I am using Visual Studio 2005.
A snippet of my code is posted below
string data = "";
char lr[5];
char rec[1028-4];
...
pageFile.read(lr, 4);
lr[4] = '\0'; // terminate string
...
pageFile.read(rec, length-4); // "length" is extracted from "lr"; it is correct, checked many times
rec[length-4] = '\0'; // terminate string
...
data = lr;
data = data + rec; // <----------- problem happens here
Thanks for any help!
|
|
|
|
|
dfn wrote: I assume this is so because one of the bytes I read (00) is treated like '\0' (null)
it's not just "treated like" a null, it is a null. C-style strings end on zero bytes.
short answer: if your data contains 0's, don't treat it as a C string.
long answer: if you need to read non-text data, you're going to have to read the data into byte arrays (char/u-char) and manipulate it there, with pointers - don't put it in std::strings or CStrings or anything like that because those objects are going to see those 0's and treat them as string terminators.
|
|
|
|
|
Thanks for your help!
I tried strcat on "lr" and "rec" (char arrays), but that resulted in the same thing as adding them to "data" (string).
I couldn't get unsigned chars to work with read().
Every attempt I made, trying to work with chars & strings, or chars only, had the same result.
|
|
|
|
|
dfn wrote: I tried strcat on "lr" and "rec" (char arrays), but that resulted in the same thing as adding them to "data" (string).
right, because binary data is not a string (strcat = string-concatenate).
you are not going to be able to use any function or object that manipulates C-style strings - no "str*" functions, no "string" objects, no *scanf, or *printf functions.
|
|
|
|
|
Ah good ol' for loops.
Thank you very much for your help. I actually learned something
|
|
|
|
|
Are you using Unicode? If so, can you use wstring instead of string ?
"A good athlete is the result of a good and worthy opponent." - David Crow
"To have a respect for ourselves guides our morals; to have deference for others governs our manners." - Laurence Sterne
|
|
|
|
|
Thanks for the reply.
Not using Unicode, the file is ANSI-encoded.
|
|
|
|
|
you have to write a short function that change all 00 bytes in a so called "string" into the real string "0x00". To do this, read or copy your char array into a unsigned char array that is much longer. then manipulate this unsigned char array (change all 00 bytes into 4 bytes "0x00", then copy the unsigned char array back to your designated string.
|
|
|
|