информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsАтака на InternetВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 700 с лишним git-серверов пострадало... 
 От повторного пришествия Шаи-Хулуда... 
 Крупный сбой Azure и других сервисов... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Спасибо! 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
<"чистая" ссылка>
окно, кстати, можно сделать невидимым:)
1




Rambler's Top100
Рейтинг@Mail.ru


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