winsock in dll
Здравствуйте!
У меня такой вопрос: можно ли в длл-ке, вызываемой из приложения,
создать winsock, подключиться этим сокетом к серверу и обмениваться с
сервером информацией (то есть полноценно работать)?
Delphi.
← Июнь 2004 → | ||||||
За последние 60 дней ни разу не выходила
Сайт листа:
http://codeguru.ru
Открыт:
21-09-2003
Пре-модерация: Нет
Адрес для писем в лист: comp.soft.prog.prog-list@subscribe.ru
Адрес
модератора: comp.soft.prog.prog-owner@subscribe.ru
Здравствуйте!
У меня такой вопрос: можно ли в длл-ке, вызываемой из приложения,
создать winsock, подключиться этим сокетом к серверу и обмениваться с
сервером информацией (то есть полноценно работать)?
Delphi.
[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
Hello keel,
Sunday, June 13, 2004, 7:49:32 PM, you wrote:
Не вижу причин, почему нет!
Только учти что созданные в DLL переменные живут тока пока в течении
одной сессии обрашений, как внутренние в функциях. Т.е. Все операции
должны быть выполнены в одной функции.
Win32)
On Tue, 15 Jun 2004 18:27:30 +0700
monah <janal***@n*****.ru> wrote:
А вот это совсем не обязательно. В ДЛЛ можно создать глобальнуя переменную. Кроме
этого, можно в одной функции создать объект какого-нибудь класса, и потом обращаться
с ним так же, как с любым другим объектом.
[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,
Wednesday, June 16, 2004, 9:50:00 AM, вы писали:
Ладно, что зделать можно конечно же верю, но как?!
Если можно, приведите пожалуйста небольшой кусок кода.
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);
}
Ну и так далее :)
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();