Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

winsock in dll

Здравствуйте!
У меня такой вопрос: можно ли в длл-ке, вызываемой из приложения,
создать winsock, подключиться этим сокетом к серверу и обмениваться с
сервером информацией (то есть полноценно работать)?
Delphi.

Ответить   Sun, 13 Jun 2004 15:49:32 +0300 (#169958)

 

Ответы:

Win32)

On Sun, 13 Jun 2004 15:49:32 +0300
keel <dima***@s*****.by> wrote:

Конечно можно, но только тебе придется вручную проинициализировать WinSock, например
так:

WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(1, 1);
int nResult = WSAStartup(wVersionRequested, &wsaData);
if (nResult == 0) {
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) {
WSACleanup();
}
}

А по окончании работы сделать WSACleanup();

Ответить   Alexander Artemenko Tue, 15 Jun 2004 09:54:05 +0400 (#170047)

 

[15.06.2004 13:07] Обнаружено письмо от keel
[15.06.2004 13:07] Тема "winsock in dll"

Да, можно.

С пожеланием доброго времени суток,
Олень Элмо
Номер выпуска : 3257
Возраст листа : 267 (дней)
Количество подписчиков : 419
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/170048
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Elmo Tue, 15 Jun 2004 13:07:52 -0700 (#170048)

 

Hello keel,

Sunday, June 13, 2004, 7:49:32 PM, you wrote:

Не вижу причин, почему нет!
Только учти что созданные в DLL переменные живут тока пока в течении
одной сессии обрашений, как внутренние в функциях. Т.е. Все операции
должны быть выполнены в одной функции.

Ответить   Tue, 15 Jun 2004 18:27:30 +0700 (#170424)

 

Win32)

On Tue, 15 Jun 2004 18:27:30 +0700
monah <janal***@n*****.ru> wrote:

А вот это совсем не обязательно. В ДЛЛ можно создать глобальнуя переменную. Кроме
этого, можно в одной функции создать объект какого-нибудь класса, и потом обращаться
с ним так же, как с любым другим объектом.

Ответить   Alexander Artemenko Tue, 15 Jun 2004 19:48:58 +0400 (#170455)

 

[15.06.2004 23:46] Обнаружено письмо от monah
[15.06.2004 23:46] Тема "[OBORONA-SPAM] winsock in dll"

Чего то ты напутал. Что еще за сессия обращений? Нормально все должно
работать.

С пожеланием доброго времени суток,
Олень Элмо
Номер выпуска : 3264
Возраст листа : 267 (дней)
Количество подписчиков : 419
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/170496
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписать : mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Elmo Tue, 15 Jun 2004 23:50:00 -0700 (#170496)

 

Здравствуйте Elmo,

Wednesday, June 16, 2004, 9:50:00 AM, вы писали:

Ладно, что зделать можно конечно же верю, но как?!
Если можно, приведите пожалуйста небольшой кусок кода.

Ответить   Wed, 16 Jun 2004 08:35:24 +0300 (#170865)

 

Win32)

On Wed, 16 Jun 2004 08:35:24 +0300
keel <dima***@s*****.by> wrote:

Вот примерно такой у тебя 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);
}

Ну и так далее :)

Ответить   Alexander Artemenko Wed, 16 Jun 2004 10:53:45 +0400 (#171033)