|
Tough to guess without knowing the code
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Cris wrote: The error is WSAEINVAL (10022) on sendto function...
WSAEINVAL = "An unknown flag was specified, or MSG_OOB was specified for a socket with SO_OOBINLINE enabled."
"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
|
|
|
|
|
This is my code:
<br />
SOCKET m_maSocketOut;<br />
struct sockaddr_in m_SockAddrOut;<br />
unsigned long m_lInet;<br />
.<br />
.<br />
<br />
void init(CString strServer)<br />
{<br />
unsigned long lInet=0;<br />
<br />
memset(&m_SockAddrOut, 0, sizeof(m_SockAddrOut));<br />
<br />
m_maSocketOut = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); <br />
m_SockAddrOut.sin_family = AF_INET;<br />
m_SockAddrOut.sin_port = htons(port);<br />
<br />
struct hostent FAR* hp = gethostbyname((char FAR *) (const char *) strServer);<br />
<br />
if (hp == NULL)<br />
{<br />
lInet = inet_addr((const char * ) strServer); <br />
if (lInet != INADDR_NONE) <br />
{<br />
validIP = TRUE; <br />
byAddress = TRUE; <br />
}<br />
}<br />
else<br />
validIP = TRUE;<br />
<br />
if (validIP)<br />
{<br />
if (byAddress)<br />
{<br />
m_SockAddrOut.sin_addr.s_addr = lInet;<br />
m_lInet = lInet;<br />
}<br />
else<br />
{<br />
m_SockAddrOut.sin_addr.s_addr = *((unsigned long far *) hp->h_addr);<br />
m_lInet = *((unsigned long far *) hp->h_addr);<br />
}<br />
<br />
if (m_maSocketOut != NULL)<br />
{<br />
bind(m_maSocketOut, (SOCKADDR*)& m_SockAddrOut, sizeof(m_SockAddrOut));<br />
WSAAsyncSelect(m_maSocketOut, hWnd, WM_EXTERNA, FD_READ | FD_CLOSE);<br />
}<br />
}<br />
}<br />
<br />
void sendData(char szData[], int len)<br />
{<br />
int result = sendto(m_maSocketOut, (char FAR *) &szData, len, <br />
NULL, (PSOCKADDR) &m_SockAddrOut, sizeof(m_SockAddrOut));<br />
m_SockAddrOut.sin_addr.s_addr = INADDR_ANY;<br />
<br />
if (result < 0)<br />
{<br />
int erroCode = WSAGetLastError();<br />
}<br />
}<br />
Important: This error code is only on Windows Vista, but not all instalations . I don't know which the exat situation, but I observed in Business and Ultimate version.
Any idea?
|
|
|
|
|
Could it be a UAC thing?
"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
|
|
|
|
|
No, the UAC configuration is not enabled.
|
|
|
|
|
I have solved the problem... removing the bind() function execution.
Acording with the MSDN documentation:
"The bind function is used on an unconnected socket before subsequent calls to the connect or listen functions. It is used to bind to either connection-oriented (stream) or connectionless (datagram) sockets. When a socket is created with a call to the socket function, it exists in a namespace (address family), but it has no name assigned to it. Use the bind function to establish the local association of the socket by assigning a local name to an unnamed socket."
I understood that the bind function is not necessary, because I only want to send datagrams with a SOCKET to server and receive the responses by the same SOCKET, and the WSAAsyncSelect function grants the data response to the app.
This is correct?
Thanks,
Cris.
|
|
|
|
|
I've been looking through the MSDN documentation, but I haven't found how to add topics to html help in a VS2003 project. In particular, some how dialog controls must be maped to IDs in the HTML help project file. (I found how to get from there to the html files.) Could anyone explain how this happens?
Nathan
|
|
|
|
|
Hi all,
I am trying to use this class http://www.codeproject.com/cs/files/CABCompressExtract.asp?df=100&forumid=336576&fr=26[^] in my dialog class. But as soon as I declare the object, it failed to compiled with the following error:
c:\testcompress\compresst.hpp(466) : error C2661: 'new' : no overloaded function takes 2 parameters
c:\testcompress\compresst.hpp(465) : while compiling class-template member function 'void *__cdecl Cabinet::CCompressT<class Cabinet::CCompress>::Alloc(unsigned int)'
Error executing cl.exe.
Here is my function call:
void CTestCompressDlg::OnButton1()
{
UINT u32_CabID = 12345;
UINT u32_SplitSize = 0x7FFFFFFF;
char s8_CompressFile[MAX_PATH];
Cabinet::CCompress i_Compress;
i_Compress.CreateFCIContext(s8_CompressFile, u32_SplitSize, u32_CabID);
}
And here is the snippet on the failing line:
namespace Cabinet
{
template <class T> class CCompressT
{
public:
...
protected:
static void* Alloc(UINT size)
{
return operator new(size);
}
...
}
}
Anyone has any idea why, please? Thanks a lot in advance.
|
|
|
|
|
Maybe try
return new BYTE(size);
or
return new unsigned char(size);
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
They didn't work either.
Btw, the demo compiles fine. How could it be?
|
|
|
|
|
Same compiler error? It works for me on VS 2005.
Do you need to include new.h?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi Mark,
Just to be clear, this is what I did:
1. Create a dialog based app
2. #include "ExtractResourceT.hpp"
#include "CompressT.hpp"
3. Create a button with OnButton1() function as above
4. Compile
Are you telling me that those steps works in VS2005?
(Mine is VC++ 6).
PS. "include new.h" generated even more errors relating to new.h
|
|
|
|
|
I recall that Visual C++ generates code with a debug feature in which new is #Define d as something else in debug builds. Does it compile in release mode?
Nathan
|
|
|
|
|
You are right. It compiles fine in release mode. This is new and weird to me...
How am I supposed to debug my app then?
|
|
|
|
|
Joe Smith IX wrote: You are right. It compiles fine in release mode. This is new and weird to me...
How am I supposed to debug my app then?
In the implementation file you are using, you could look for the #define new statement and remove it. If you want to keep the ability to detect memory leaks from that code, you can change it to #define TNEW , add a #else clause with #define TNEW new , and then replace all standard calls to new with TNEW .
Nathan
|
|
|
|
|
But when I search for it, the only two instances of 'define new' are the standard one below in my dialog and app .cpp files. Could it be defined some other way? Or any other workaround to make it compilable in debug mode?
Thanks.
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
|
|
|
|
|
Do you really need to call the operator directly?
Can you just use the vector form of new and allocate an array of bytes?
return new BYTE[size];
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Well, the thing is that the call is made from the class I downloaded from CP (see my first post above). If I change the object, then I have to modify the class as well, right?
What makes me wonder is that how come I can run the demo code in debug mode and step thru line-by-line, while in my test project I can't even compile the debug mode? They both using the same classes!
Any ideas? thanks for any suggestion.
|
|
|
|
|
If the problem is with using the DEBUG_NEW operator in debug builds, then you
can wrap your calls to operator new with something like
#pragma push_macro("new")
#undef new
...
(use the new operator here)
...
#pragma pop_macro("new")
The problem is, where do you put this in a template class? Do you put it in the class
declaration or do you have to remember to do it every place you instantiate an object
of the class?
I haven't seen the rest of the class in question, but I assume if it calls operator new, then
it must call operator delete somewhere. Those should be the only calls you'd need to change.
I have no idea why the author did that - is the operator new overloaded in the class?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: #pragma push_macro("new")
#undef new
...
(use the new operator here)
...
#pragma pop_macro("new")
That's cool. I didn't know about the #pragma push_macro . Thanks for mentioning it.
Nathan
|
|
|
|
|
You are right about the conflict is with the definition of DEBUG_NEW operator in debug builds. As soon as I commented all instances, it compiled fine.
I can't find any code that overload new operator in the class, though...
Using the push_macro and pop_macro resulted this error:
#pragma push_macro : 'new' is not currently defined as a macro
Anyway, what's the effect I will get by commenting out the definition of DEBUG_NEW? Thanks.
|
|
|
|
|
Joe Smith IX wrote: what's the effect I will get by commenting out the definition of DEBUG_NEW?
You just lose the file/linenumber info in debug builds that aid in finding memory leaks.
I'm still not sure why the author used new like that...
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
In that case, is there any way to undef the DEBUG_NEW just before the conflicting code, and then re-define it right afterward?
Something like below: (except this one generated one warning)
static void* Alloc(UINT size)
{
#ifdef _DEBUG
#undef new DEBUG_NEW // <-- compile warning C4067: unexpected tokens following preprocessor directive - expected a newline
#endif
return operator new(size);
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
} Thanks.
|
|
|
|
|
Sorry for the late reply - did you get this working?
The line with the warning should be just
#undef new As I mentioned before, I'm just not sure where this should be in a template class.
Since the actual class is built where an object is instantiated, I'm not sure if
the #undef stuff needs to be there or if it worke by putting it in the template declaration.
If it works in the template declaration (as you've shown) then that's cool
It's easy enough to test.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|