On Wed, 16 Jun 2004 08:35:24 +0300
keel <dima***@s*****.by> wrote:
> Здравствуйте Elmo,
>
> Wednesday, June 16, 2004, 9:50:00 AM, вы писали:
>
> m>> Не вижу причин, почему нет!
> m>> Только учти что созданные в DLL переменные живут тока пока в течении
> m>> одной сессии обрашений, как внутренние в функциях. Т.е. Все операции
> m>> должны быть выполнены в одной функции.
> E> Чего то ты напутал. Что еще за сессия обращений? Нормально все должно
> E> работать.
>
>
> Ладно, что зделать можно конечно же верю, но как?!
> Если можно, приведите пожалуйста небольшой кусок кода.
Вот примерно такой у тебя main
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
DWORD thread_id = 0;
HANDLE thread = 0;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
curr_channel = 0;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
ERRPRINT("Error: WSAStartup()\n");
return(0);
}
if ( LOBYTE( wsaData.wVersion ) != 2 ||
HIBYTE( wsaData.wVersion ) != 2 ) {
WSACleanup( );
return(0);
}
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
// Освобождение выделенных системных ресурсов
WSACleanup();
break;
}
return TRUE;
}
И у тебя может быть определен класс, скажем CNetClient. Вот пример одного из
методов, как раз для подключения к серверу
int CNetClient::NetConnect(in_addr address, unsigned int Port, int TimeOut)
{
long err;
unsigned long parm = 1;
SOCKADDR_IN addr;
fd_set set;
TIMEVAL timeout;
MSocketList *snew = 0;
int numsocks = 0;
SOCKET sock = INVALID_SOCKET;
timeout.tv_sec = 0;
timeout.tv_usec = TimeOut*1000;
sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock == INVALID_SOCKET)
return(0);
//ioctlsocket(sock, FIONBIO, &parm); // Переводим в режим без блоков
setNonBlockSock( sock );
int opt;
int optlen = sizeof(opt);
int iRet;
opt = 64*1024;
iRet = setsockopt( sock, SOL_SOCKET, SO_SNDBUF, (char *)&opt, optlen );
if( iRet != 0 )
iRet = WSAGetLastError();
iRet = setsockopt( sock, SOL_SOCKET, SO_RCVBUF, (char *)&opt, optlen );
if( iRet != 0 )
iRet = WSAGetLastError();
ZeroMemory(&addr, sizeof(addr));
addr.sin_addr = address;
addr.sin_port = htons(Port);
addr.sin_family = AF_INET;
if(connect(sock, (const SOCKADDR *)&addr, sizeof(addr)) == SOCKET_ERROR)
err = WSAGetLastError();
FD_ZERO(&set);
FD_SET(sock, &set);
numsocks = select(INT_MAX, 0, &set, 0, &timeout); // Ждем пока не установится
связь
if(FD_ISSET(sock, &set)) {
snew = SockList.Add(sock, &addr);
NumClientSocks++;
snew->channel = ++curr_channel;
//DelAllClientThreads();
if( !NumClientThreads )
AddClientThread();
return(snew->channel);
} else {
return(0);
}
return(0);
}
Ну и так далее :)