информационная безопасность
без паники и всерьез
 подробно о проекте
За кого нас держат?Страшный баг в WindowsSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Критическая уязвимость UEFI позволяет... 
 Японский хостинг попросил клиентов... 
 Компрометация eMudhra вынудила... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Как быть?? 08.10.01 01:23  Число просмотров: 1073
Автор: ggg <ggg> Статус: Elderman
<"чистая" ссылка>
разберись с сокетами
(кажется на www.uinc.ru есть статья)

и потом используй например WSAEventSelect() если не хочешь создавать окно

кстати если тебе не нужно окно, то может быть не имеет смысла использовать неблокирующие сокеты
(с блокирующими проще)
<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
<"чистая" ссылка>
окно, кстати, можно сделать невидимым:)
1





Рейтинг@Mail.ru


  Copyright © 2001-2026 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach