|
I want to make a proxy scaner, but I don't know how to open a socket.
I want to make connection to some computer and try to make a TCP/IP connection to a definite port. If I can connect to try whether It is a proxy server.
But I do not know how to make this in MFC.
Can someone help me?
Trin2
|
|
|
|
|
ummmmm i would suggest u do some reading about tcp/ip and the various protocols b4 taking on this level of project if u dont understand how to open a socket
try www.w3c.org and look up some rfcxxx docs
"traffic lights are for people who can't make their own decisions" biz stuff about me
|
|
|
|
|
lauren wrote:
try www.w3c.org and look up some rfcxxx docs
Now that's the nicest way I've seen somebody tell somebody else to sod off in a while
he he he. I like it in the kitchen! - Marc Clifton (on taking the heat when being flamed)
Awasu v0.4a[^]: A free RSS reader with support for Code Project.
|
|
|
|
|
Hi everyone. I have a question about the use of CFile. I have the code below, and the filename is that of a file which I have tested and determined exists, and is not shared. The file is an HTML file, and I want to take the contents of the HTML file (the text), and put it into a CString. The string will then be parsed and the hyperlinks extracted.
<br />
CFile cFile;<br />
CString strFileContents;<br />
<br />
cFile.Open(m_strFileName, CFile::modeRead | CFile::shareExclusive);<br />
cFile.Read(&strFileContents, cFile.GetLength());<br />
cFile.Close();<br />
The problem with the code above is that when the Read is performed, the program crashes. I tried using an old style C string in place of a CString, the data is read but a bunch of garbage chars are at the end of the string, and the program crashes when I hit Close(). Anyone know what I am doing wrong? I really want the file contents in a CString, because the necessary memory is allocated dynamically, and the CString Find functions are great for parsing.
|
|
|
|
|
First of all, you can't put the whole file in a single CString object.
You may try to read the file line by line.
You do not use the Read function correctly, first parameter is the block you read, the second is the size of that block. Usualy used for reading a binnary file.
Good Luck!
Trin2
|
|
|
|
|
CSting doesn't allocated anything till you initialize it.
Since you didn't allocated, you got crash.
Change your code to the following:
cFile.Read(strFileContents.GetBuffer(SIZE), cFile.GetLength());
After finishing working with the string call
strFileContents.ReleaseBuffer();
|
|
|
|
|
Excuse me.
Today,I study the WTL Library's CSimpleArray class source code,I find the following code:
<code>template<class T>
class CSimpleArray
{
T* m_aT;
...
class Wrapper
{
public:
Wrapper(T& _t) : t(_t)
{
}
template <class _Ty>
void *operator new(size_t, _Ty* p)
{
return p;
}
T t;
};
void SetAtIndex(int nIndex, T& t)
{
new(&m_aT[nIndex]) Wrapper(t);
}
...
}</code> I can not understand the syntax about "new(&m_aT[nIndex]) Wrapper(t)" ,anyone can explain it? thanks first.
SIMPLE IS BEAUTY
|
|
|
|
|
ZBUILDER wrote:
I can not understand the syntax about
ZBUILDER wrote:
new(&m_aT[nIndex]) Wrapper(t);
returns the pointer and that new allocates using that pointer
* * * Code the dreams * * *
|
|
|
|
|
Then What about Wapper(t)?
And How does it modify the Adderss of &m_aT[nIndex]?
SIMPLE IS BEAUTY
|
|
|
|
|
It's called placement new. You're executing the Wrapper-constructor on an already allocated memory block.
--
Only in a world this sh*tty could you even try to say these were innocent people and keep a straight face.
|
|
|
|
|
ZBUILDER wrote:
new(&m_aT[nIndex]) Wrapper(t)
It's called placement new. It executed the constructor Wrapper(t) on a preallocated memory block &m_aT[nIndex]. So basically, you're telling new not to allocate new memory for the object but use existing memory.
--
Only in a world this sh*tty could you even try to say these were innocent people and keep a straight face.
|
|
|
|
|
hi everyone,
i added a context menu to my sdi project, based on treeview, but the context menu doesn't work correctly. the problem with my context menu is that whenever i right single click on a treenode, the context menu doesn't popup, which the context menu supposes to popup. the context menu only pops up when i double right click on a node.. i'm running winxp and using visual studio.net.. any suggestion is welcome.. thx in advance.
this is the code i added to my message map:
ON_WM_CONTEXTMENU()
this are the codes that i used for my context menu:
void CLeftView::OnContextMenu(CWnd *pWnd, CPoint point)
{
CMenu menu;
menu.LoadMenu(IDR_MENU1);
menu.GetSubMenu(0)
->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y, this);
}
|
|
|
|
|
NOTE: This is a fairly long post.
I have not implemented my own template class before though I have used STL and MFC template classes extensively. I have a situation that I believe can be best dealt with by writing a template class.
Here's the deal:
I have 10-20 console apps which generate data files of various formats from a specified input data source of a known type. For the most part the source data defines the structure of the output based on its configuration. The simplest way to implement these is to just iterate the input records and then in an inner loop examine the data's configuration and produce the correct output.
What I would like to do is to create a template class from which I can construct an "execution plan". The template class would provide an interface for 1) examining the data source and making decisions on the output structure, 2) iterating the data source recordset, 3) following the steps that were decided in #1 for each record.
The way I see it being implemented is something like this (pseudocode):
class BaseExecutionStep
{
}
class ExecutionStep_OutputNumber
{
short sLength;
bool bLeadingZeroes;
short sDecimalPlaces;
}
class ExecutionStep_OutputDate
{
string strFormat;
date dtNullDate;
bool bHideNullDates;
}
class ExecutionStep_OutputText
{
short sLength;
bool bRemoveUndesiredChars;
short sAlign; (left, right, center)
}
class ExecutionStepFactory
{
ExecutionStep* CreateStep(SomeSourceObject);
}
template class ExecutionPlan<ExecutionStepFactory, DataSource, Filter>
{
BuildPlan(); // build a list, array, set of ExecutionSteps using the ExecutionStepFactory
DescribePlan(); // for auto-documentation
ExecutePlan(); //
}
What I would ideally want is to be able to use this same execution plan template class to make the development of these "iterative" proccesses a little more standardized. Ideally I could create any new ExecutionStepFactory and any new DataSource object and be able to use the template to deal with the nasty little details of actually doing this work.
Is this a reasonable use of templates? Is there a better way than what I have descrived here?
|
|
|
|
|
This looks like an example of some really contemporary design techniques (policies) described by Andrei Alexandrescu in his book "Modern C++ Design."
While his ideas look great in theory, I've never been game to try them out because they look like a maintenance nightmare and it would be harder to find developers capable of maintaining such sophisticated code. Don't be fooled - writing (good) templated code is *much* harder than it first might appear (and VC6's support for templates is woeful!)
There's no reason why a simpler solution would not be just as effective e.g. creating your worker classes as you describe but instantiating them and passing them to ExecutionPlan as runtime parameters rather than templated, compile-time parameters.
If you go the template route, I'd be very interested to hear how it went. Write an article about it!
he he he. I like it in the kitchen! - Marc Clifton (on taking the heat when being flamed)
Awasu v0.4a[^]: A free RSS reader with support for Code Project.
|
|
|
|
|
Thanks for the feedback.
Taka Muraoka wrote:
maintaining such sophisticated code
I tend to agree, but not having done it I am just not certain how complex it will be in the end.
Taka Muraoka wrote:
There's no reason why a simpler solution would not be just as effective e.g. creating your worker classes as you describe but instantiating them and passing them to ExecutionPlan as runtime parameters rather than templated, compile-time parameters.
This was my first idea, but even this will be somewhat complicated and will require a funamental understanding of the implementation to be able to use it. The reason I am looking into templates is because I think the complexity may not be much more and would be far more flexible (I think??) with not much more actual coding on my part.
Taka Muraoka wrote:
If you go the template route, I'd be very interested to hear how it went. Write an article about it!
While I need this for an actual real-life problem, I had thought of using it as the basis for a future article. Only time will tell.
Thanks again,
Matt Gullett
|
|
|
|
|
Matt Gullett wrote:
I am just not certain how complex it will be in the end.
Writing templated code is *much* harder than writing bog-standard OO code because you have no idea what your template parameters are. If you know they're only going to be standard data types like an int or a float that's one thing, but when they're classes like what you're proposing, it gets much more tricky. You either require that all classes have a uniform interface, in which case you might as well just have a class hierarchy, or you allow a varying interface.
With a class hierarchy, you have a base class with a bunch of pure virtual functions and derived classes have to implement them, regardless of whether or not they actually use them. The cool things about policies is that Alexandrescu takes advantage of the fact that template code that is never used doesn't get compiled (and therefore cannot cause compile errors). So he passes in classes with varying interfaces and as long as you don't try to use functionality that is not provided by your template parameter classes, your stuff will work just fine.
The book is worth a read but it's really tough! I couldn't read more than a chapter at a time because it just made my head hurt. I still don't understand half of it
he he he. I like it in the kitchen! - Marc Clifton (on taking the heat when being flamed)
Awasu v0.4a[^]: A free RSS reader with support for Code Project.
|
|
|
|
|
Thanks for the additional advice. I actually own this book, but I have never fully read it. I guess I need to get it out and re-read it.
One thing that concerns me in your statement:
Taka Muraoka wrote:
The cool things about policies is that Alexandrescu takes advantage of the fact that template code that is never used doesn't get compiled (and therefore cannot cause compile errors).
As I understand it, this is not really true. If I need to export a fully-qualified template class from a DLL, the compiler will always compile the whole thing. My software applications make heavy use of DLLs and this has already been an issue when working with STL.
Anyway, you have just about convinced me to not bother with the template based solution, but I will keep researching a little. I have a little time before I need to make a decision.
Thanks,
Matt Gullett
|
|
|
|
|
Matt Gullett wrote:
If I need to export a fully-qualified template class from a DLL, the compiler will always compile the whole thing.
I read something a few months back from a compiler vendor (not Microsoft) who had tried to implement something where you could compile a template class into a .LIB that you could distribute *without* having to supply the source. Apparently it was Really Hard to do and they still couldn't get it to work exactly the way you would expect or want.
Templating is a compile-time thing. For example, how do you put this in a DLL so that somebody can use it at *runtime*:
template< typename T><br />
struct Foo<br />
{<br />
void incrementFoo( T& t ) { ++t ; }<br />
} ;
You don't know what T is until you try to compile something using this class so how can you possibly put it in a DLL (without some kind of pre-compiled template information)?
/taka thinks for a minute...
Unless you mean that VC is compiling everything in a templated class regardless of whether it's used or not. That's (yet another) a problem with VC's template handling, then. It's not supposed to do that.
he he he. I like it in the kitchen! - Marc Clifton (on taking the heat when being flamed)
Awasu v0.4a[^]: A free RSS reader with support for Code Project.
|
|
|
|
|
What I am reffering to is not exporting a template class, but a fully qualified template typedef (typedef may not be the correct term.)
For instance, I have a dll that uses a std::list<csomeclass> and needs to have this passed into one of its exported classes for various functions. To make this work you must write a line something like this (pseudocode):
extern template class __declspec(dllexport) std::list<csomeclass>;
|
|
|
|
|
In this case I'd just use virtual functions and inheritence.
Todd Smith
|
|
|
|
|
Thanks for the advice.
That is what I am leaning towards right now. I think the template solution may just be overly complex for the actual requirements at hand.
Thanks,
Matt Gullett
|
|
|
|
|
I've been working on serial IO for a few days now. To creep up on it, I started out non overlapped, and it was a piece of cake. Then I decided to add a thread to handle the reads. My first version used a while(true) loop in the thread, and polled for data in the receive buffer. It worked fine, but I didn't like the fact that it was always looping. Here's where the fun begins... I changed to overlapped IO, and was amazed that my first version worked (I thought). Unfortunately, it only worked when I sent packets that were relatively small, less than 6 bytes. If I send more than 6 bytes, WaitForMultipleObjects won't return after the first read. I'll paste the thread's code at the end of this. A lot of it is commented out to make sure something (incorrect memory management or whatever) wasn't causing the problem.
Here's the result of my debug so far...
If I send data of just a few bytes, everything works as expcted. WaitForMultibleObjects returns whenever data is received, and waits again the next time it is called.
If I send the magic number of 9 bytes...
WaitForMultipleObjects returns execution to the thread.
I read data out of the port with ReadFile.
Loop back to WaitForMultipleObjects, and wait for more.
Now if I send another character, or string of chars, WaitForMultipleObjects does not return! I have another entry point to read the serial port from the main thread, and if I use it, I can read the data. In addition, when I read the data with that other entry point, the WaitForMultipleObjects function returns, but finds no data since the main thread read it (that's expected). From this point on, WaitForMultipleObjects won't return when characters are received by the port.
I tried clearing the threads lasterror before the ReadFile, and then checked the error after the ReadFile command, and get "command exited normally" or words to that effect.
The readfile is opened with 1000 byte buffers for both read and write.
Any help would be greatly appreciated!
Read Thread.................................................................
UINT CSerial::ReadPortThread(LPVOID lpvParam)
{
CSerial *pSerial = (CSerial*)lpvParam;
int bytesin;
pSerial->hReadEvents[0] = CreateEvent(NULL, true, false, NULL);
pSerial->hReadEvents[1] = CreateEvent(NULL, true, true, NULL);
pSerial->OverlappedRead.hEvent=pSerial->hReadEvents[1];
SetCommMask(pSerial->m_hIDComDev,EV_RXCHAR);
DWORD evt;
DWORD dwHandleSignaled;
SetLastError(0);
while (true)
{
if (!WaitCommEvent(pSerial->m_hIDComDev,&evt, &pSerial->OverlappedRead))
{
if (ERROR_IO_PENDING!=GetLastError())
{
TRACE("WaitCommEvent failed, exiting Read Thread\n");
return 0;
}
}
if (!ResetEvent(pSerial->OverlappedRead.hEvent))
{
TRACE("ResetEvent failed, exiting Read Thread\n");
return 0;
}
dwHandleSignaled=WaitForMultipleObjects(2,
pSerial->hReadEvents,
FALSE,
INFINITE);
switch(dwHandleSignaled)
{
case WAIT_OBJECT_0 + 1:
{
if ( (bytesin=pSerial->ReadDataWaiting()) > 0)
{
char buff[500];
DWORD BytesRead;
TRACE("Before ReadFile ");
pSerial->TraceLastError(GetLastError());
SetLastError(0);
ReadFile(pSerial->m_hIDComDev,
buff,bytesin,&BytesRead,
&pSerial->OverlappedRead);
TRACE("After ReadFile ");
pSerial->TraceLastError(GetLastError());
}
break;
}
case WAIT_OBJECT_0:
{
PurgeComm(pSerial->m_hIDComDev,PURGE_RXABORT | PURGE_RXCLEAR);
return 0;
}
}
}
}
|
|
|
|
|
Wow, this is ugly, all the formatting is gone. Is there a better way to put code up here?
Also, double checked the number of characters that works, and as long as I'm reading no more than 8 characters with ReadFile, everything is fine. If I read 9 or more, is when I get into trouble.
|
|
|
|
|
Put the code in a <pre> block, not <code> - <pre> preserves spacing.
--Mike--
Friday's GoogleFight results: Britney Spears 2,190,000 - Erica Weichers 23
1ClickPicGrabber - Grab & organize pictures from your favorite web pages, with 1 click!
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|
|
First, don't call ResetEvent() after calling WaitCommEvent(). Your resetting the event which may have gotten set between your call to WaitCommEvent() and your call to ResetEvent(). You should do the ReadFile() first, then wait again, and get rid of the WaitForMultipleObjects. Additionally, I wouldn't use a separate event to signal the thread to quit. I'd just add another member variable for that, or even better, just set the thread handle to NULL. Lastly, you need to ensure your timeouts are set correctly. I've added a sample of what it should like at the end. Below is my implementation of your thread (some stuff removed for brevity, some errors not checked, and probably a few typo's, but you'll get the drift).
for (;;)
{
WaitCommEvent(....);
//check if WaitCommEvent succeeded or failed
if (GetLastError() != ERROR_IO_PENDING){
//something went horribly wrong with WaitCommEvent(), so
//clear all errors and try again
DWORD comerrors;
ClearCommError(pSerial->m_hIDComDev,&comerrors,0);
}else{
//IO is pending, wait for it to finish
if (GetOverlappedResult(pSerial->m_hIDComDev,&pSerial->OverlappedRead,&dwBytes,TRUE)){
//event occurred, see if it was an RX CHAR event
if (dwEvent == EV_RXCHAR){
pSerial->HandleIncomingData()
}else{
//event wasn't an RXCHAR... This can happen if someone changed
//the event mask (a common way to signal the thread to quit)
//so check if we were signaled to quit
if (pSerial->m_hRxThread == NULL)
break;
else
//else the event mask got all buggered up, so reset it
SetCommMask(pSerial->m_hIDComDev,EV_RXCHAR);
}//dwEvent == EV_RXCHAR
}else{
//GetOverLappedResult() result failed... handle that here
...
}
//now reset the event handle so we can start all over again
ResetEvent(pSerial->OverlappedRead.hEvent);
}
void CSerial::HandleIncomingData()
{
DWORD chars_read =0;
bool bDone = false;
//loop until there's no data in the rx buffer
while (!done){
ResetEvent(m_osRead.hEvent);
if (!ReadFile(m_hIDComDev,m_pIncomingData+m_dwDataIndex, m_cbDataBuf-
m_dwDataIndex, &chars_read,&OverlappedRead)){
if (GetLastError != ERROR_IO_PENDING){
//read failed, so just exit
done = true;
continue;
}else{
//read pending, wait for it to complete
DWORD dwRes = WaitForSingleObject(m_osRead.hEvent,INFINITE);
switch (dwRes){
case WAIT_OBJECT_0: //read event has completed
//did the read fail?
if (!GetOverlappedResult(m_hPort,&m_osRead,&chars_read,FALSE)){
done = true; //yep, break out
continue;
}else{
//read succeeded, did we read in any chars?
if (chars_read == 0){
//nope, so we timed out
done = true;
continue;
}else{
//read in some chars, so increment the index
m_dwIndex += chars_read;
//resize the data buffer if necessary
if (m_dwIndex >= m_cbDataBuf)
ResizeBuffer();
}
}
break;
default:
//got an error, so we are definitely done
done = true;
break;
}
}
}else{
//ReadFile succeed immediately, handle the chars
if (chars_read > 0)
m_dwIndex += chars_read;
else
done = true;
if (m_dwIndex >= m_cdDataBuf)
ResizeBuffer();
}
}
}
To signal the thread to quit, do the following:
void CSerial::StopRxThread()
{
//save a copy of our handle
HANDLE temp = m_hRxThread;
//signal the thread to quit by setting the handle to NULL
m_hRxThread = NULL;
//change the event mask to none. This will let the thread
//continue if it's waiting for WaitCommEvent() or
//GetOverlappedResult()
SetCommMask(m_hIDComDev,0);
//wait for the thread to exit
WaitForSingleObject(temp,THREAD_STOP_TIMEOUT);
//thread exited, close the handle
CloseHandle(temp);
}
Lastly, the code for setting the port timeouts
void CSerial::SetPortTimeouts()
{
COMMTIMEOUTS to={0};
to.ReadIntervalTimeout = MAXDWORD;
to.ReadTotalTimeoutMultiplier = MAXDWORD;
to.ReadTotalTimeoutConstant = (DWORD)m_lCommTimeout; // in milliseconds
to.WriteTotalTimeoutConstant = (DWORD)m_lCommTimeout; // in milliseconds
if (m_hPort != 0)
::SetCommTimeouts(m_hPort,&to);
}
Hope this helps,
Pat
|
|
|
|
|