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
|