Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |  |  |  |
Спасибо! 08.10.01 20:07 Число просмотров: 911
Автор: Лamo Статус: Незарегистрированный пользователь
|
|
Спасибо! я разобрался!!
|
|
<programming>
|
[C++] Как быть?? 07.10.01 23:19
Автор: Лamo Статус: Незарегистрированный пользователь
|
Переписываю код из одной проги в свою,
но моя прога не имеет окна, сделана просто как WinMain
А в той проге есть регестированное сообщение от сокета:
int sockmess = RegisterWindowMessage();
и используется WSAAsyncSelect(sock, m_hWnd, sockmess, FD_READ | FD_CONNECT);
а потом ловяца мессаги:
ON_REGISTERED_MESSAGE(sockmess, OnSockFunc)
LONG OnSockFunc(SOCKET sock, LONG Event)
{
evnt = WSAGETSELECTEVENT(Event);
switch(evnt)
{
case FD_READ:
{
}
case FD_CONNECT:
{
}
}
return 0;
}
Понятно что в моей проге нету m_hWnd и сообщения нельзя зарегистрировать,
как быть?? что можно придумать????
|
 |
[C++] Как быть?? 08.10.01 01:23
Автор: ggg <ggg> Статус: Elderman
|
разберись с сокетами
(кажется на www.uinc.ru есть статья)
и потом используй например WSAEventSelect() если не хочешь создавать окно
кстати если тебе не нужно окно, то может быть не имеет смысла использовать неблокирующие сокеты
(с блокирующими проще)
|
 |  |
[C++] Как быть?? 08.10.01 14:05
Автор: Лamo Статус: Незарегистрированный пользователь
|
Просто прога отправляет данные, и потом с помощью сообщений от сокета ждёт ответа, короче вроде соединение синхронное,
как быть?? как сделать как в юниксах??
|
 |  |  |
[C++] Как быть?? 08.10.01 17:21
Автор: йцукенг <jcukeng> Статус: Member
|
// Инициализируем Windows socket system
int CSMTP::MailConnect(char *smtp_server)
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(1, 1);
int nResult = WSAStartup(wVersionRequested, &wsaData);
if (nResult != 0)return false;
if (LOBYTE(wsaData.wVersion) != 1|HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return false;
}
SOCKET sc;
int res;
short portnum;
/* Create Socket */
if ((sc = socket(PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET)
return (FAILED_TO_OBTAIN_SOCKET_HANDLE);
portnum = 25;// SMTP protocol
/* Connect to server */
sock_in.sin_family = AF_INET;
sock_in.sin_port = htons(portnum);
sock_in.sin_addr.S_un.S_addr = GetAddr(smtp_server);
if (connect(sc, (LPSOCKADDR) & sock_in, sizeof(sock_in)))
return (FAILED_TO_CONNECT);
res = Ack();
return (res);
}
int CSMTP::Ack()
{
static char *buf;
int rlen;
int Index = 0;
int Received = 0;
if (!buf)
if ((buf = (char *) malloc(1024 * 4)) == NULL)
return (OUT_OF_MEMORY);
again:
if ((rlen = recv(sc, buf + Index, ((1024 * 4) - 1) - Received, 0)) < 1)
return (FAILED_TO_RECEIVE);
Received += rlen;
buf[Received] = 0;
Index += rlen;
if ((buf[Received - 4] == ' ' && buf[Received - 3] == '-')| (buf[Received - 2] != '\r')|(buf[Received - 1] != '\n'))
goto again;/* Incomplete data. Line must be terminated by CRLF And not contain a space followed by a '-' */
cout<<"serber response:\r\n"<<buf<<"\r\n";
if (buf[0] > '3')
return (SMTP_SERVER_ERROR);
return (SUCCESS);
}
---
Это кусочек кода из моей проги, которую я писал с оглядкой на какой-то пример с sources.ru(кстати - рекомендую, неплохой сайт).
В общем, идея весьма простая - создаешь сокет(socket(...)), коннектишься((connect(...) , посылаешь запрос( send(...), здесь не приведено), получаешь ответ(recv(...)), и т.д.
К сожалению, в виндах нельзя сделать fprintf прямо в сокет. В юниксах это вроде практикуется:).
Основная проблема при таком подходе - возможная блокировка. Например, ты читаешь данные из сокета, а их там нет :((. Приходится либо извращаться, либо использовать асинхронные сокеты.
удачи!
йцукенг
|
 |  |  |  |
Спасибо! 08.10.01 20:07
Автор: Лamo Статус: Незарегистрированный пользователь
|
|
Спасибо! я разобрался!!
|
 |
либо завести окно:) , либо писать как в юниксах. 08.10.01 01:13
Автор: йцукенг <jcukeng> Статус: Member
|
|
окно, кстати, можно сделать невидимым:)
|
|
|