CAsyncSocket problems

CAsyncSocket problems

Anonymous
Not applicable
274 Views
1 Reply
Message 1 of 2

CAsyncSocket problems

Anonymous
Not applicable
Hi everybody,
I'm trying to open a server MFC CAsyncSocket in an ARX module with something like

socket.Create(1234);

if i log as administrator (Windows 2000sp3), the Create() returns with an error WSANOTINITIALISED.
It seems that this error happens also with LAN computers with dynamic assigned IP's.

Any hint, please?

Thanks!

PS: When I exit AutoCAD, UnloadApplication is always called?
0 Likes
275 Views
1 Reply
Reply (1)
Message 2 of 2

Anonymous
Not applicable
xizor wrote:
> Hi everybody,
> I'm trying to open a server MFC CAsyncSocket in an ARX module with
> something like
>
> socket.Create(1234);
>
> if i log as administrator (Windows 2000sp3), the Create() returns with
> an error WSANOTINITIALISED.
> It seems that this error happens also with LAN computers with dynamic
> assigned IP's.
>
> Any hint, please?
>
> Thanks!
>
> PS: When I exit AutoCAD, UnloadApplication is always called?
>

I have not been able to get the MFC socket classes to work properly from within
an arx. I use the following wrapper class for a raw socket connection. Works
in a separate thread as well 🙂

// declaration

class CxSocket
{
public:
CxSocket();
virtual ~CxSocket();
void Close() { closesocket(m_Socket); m_Socket = INVALID_SOCKET; }
void Attach(SOCKET socket) { m_Socket = socket; }
SOCKET Detach() { SOCKET s = m_Socket; m_Socket = INVALID_SOCKET; return s; }
operator SOCKET() { return m_Socket; }
BOOL Create();
BOOL Connect(LPCTSTR lpszHostAddress, UINT nHostPort);
BOOL Bind(UINT nSocketPort = 0, LPCTSTR lpszSocketAddress = NULL);
BOOL Listen(UINT backlog = 5);
BOOL GetPeerName(CString& rPeerAddress, UINT& rPeerPort);
BOOL GetSockName(CString& rSocketAddress, UINT& rSocketPort);
private:
SOCKET m_Socket;
CString m_PeerAddress;
CString m_SockAddress;
UINT m_PeerPort;
UINT m_SockPort;
};

// implementation

CxSocket::CxSocket()
{
m_Socket = INVALID_SOCKET;
m_PeerPort = -1;
m_SockPort = -1;
}

CxSocket::~CxSocket()
{
Close();
}

BOOL CxSocket::Create()
{
m_Socket = socket(PF_INET, SOCK_STREAM, 0);
return m_Socket != INVALID_SOCKET;
}

BOOL CxSocket::Connect(LPCTSTR lpszHostAddress, UINT nHostPort)
{
USES_CONVERSION;
ASSERT(lpszHostAddress != NULL);
SOCKADDR_IN sockAddr;
memset(&sockAddr,0,sizeof(sockAddr));
LPSTR lpszAscii = T2A((LPTSTR)lpszHostAddress);
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = inet_addr(lpszAscii);
if(sockAddr.sin_addr.s_addr == INADDR_NONE)
{
LPHOSTENT lphost;
lphost = gethostbyname(lpszAscii);
if (lphost != NULL)
sockAddr.sin_addr.s_addr = ((LPIN_ADDR)lphost->h_addr)->s_addr;
else
{
WSASetLastError(WSAEINVAL);
return FALSE;
}
}
sockAddr.sin_port = htons((u_short)nHostPort);
int result = connect(m_Socket, (SOCKADDR*)&sockAddr, sizeof(sockAddr));
if(result == SOCKET_ERROR)
{
WSASetLastError(GetLastError());
return FALSE;
}
return TRUE;
}

BOOL CxSocket::Bind(UINT nSocketPort, LPCTSTR lpszSocketAddress)
{
USES_CONVERSION;
SOCKADDR_IN sockAddr;
memset(&sockAddr,0,sizeof(sockAddr));
LPSTR lpszAscii = T2A((LPTSTR)lpszSocketAddress);
sockAddr.sin_family = AF_INET;
if(lpszAscii == NULL)
sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
else
{
DWORD lResult = inet_addr(lpszAscii);
if (lResult == INADDR_NONE)
{
WSASetLastError(WSAEINVAL);
return FALSE;
}
sockAddr.sin_addr.s_addr = lResult;
}
sockAddr.sin_port = htons((u_short)nSocketPort);
int result = bind(m_Socket, (SOCKADDR*)&sockAddr, sizeof(sockAddr));
if(result == SOCKET_ERROR)
{
WSASetLastError(GetLastError());
return FALSE;
}
return TRUE;
}

BOOL CxSocket::Listen(UINT backlog)
{
int result = listen(m_Socket, backlog);
if(result == SOCKET_ERROR)
{
WSASetLastError(GetLastError());
return FALSE;
}
return TRUE;
}

BOOL CxSocket::GetPeerName(CString& rPeerAddress, UINT& rPeerPort)
{
SOCKADDR_IN sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
int nSockAddrLen = sizeof(sockAddr);
if(SOCKET_ERROR != getpeername(m_Socket, (SOCKADDR*)&sockAddr, &nSockAddrLen))
{
rPeerPort = ntohs(sockAddr.sin_port);
rPeerAddress = inet_ntoa(sockAddr.sin_addr);
return TRUE;
}
return FALSE;
}

BOOL CxSocket::GetSockName(CString& rSocketAddress, UINT& rSocketPort)
{
SOCKADDR_IN sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
int nSockAddrLen = sizeof(sockAddr);
if(SOCKET_ERROR != getsockname(m_Socket, (SOCKADDR*)&sockAddr, &nSockAddrLen))
{
rSocketPort = ntohs(sockAddr.sin_port);
rSocketAddress = inet_ntoa(sockAddr.sin_addr);
return TRUE;
}
return FALSE;
}

--
|
----+----------------------------------------------
| Byron Blattel
| CADwerx---Applications for AutoCAD
| Autodesk Registered Developer
| email: byron@cadwerx.net
| web site: http://www.cadwerx.net
|
0 Likes