Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сервис не хочет обрабатывать события сокета  (Прочитано 11241 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 11-04-2005 09:13 » 

Взял из диалогового приложения код соединения с сервером засунул его в сервис
//---------------------------------------------------------------------------------------------------------------------------
void CMyService::MakeConection()
//
//Установка соединения
//
{

    m_pSocket = new MySocket();

    m_pSocket->Create();
   if(m_pSocket->Connect(m_ip, 2049)){//2049 номер порта
   m_pSocket->Send(m_Name,m_Name.GetLength());//Отправляем имя
   m_pSocket->m_Pointer=this;//Передаем указатель на себя
   m_Logs.LogString("Соединение с сервером установлено\n\r");
   }
   else{
      delete m_pSocket;
      m_pSocket=NULL;
      int err=GetLastError();
      CString Item;
      Item.Format("Ошибка соединения с сервером - %d \n\r",err);
      m_Logs.LogString(Item);
      }
}
Сервис соединяется с сервером !НО! почему то не вызываются обработчики

void MySocket::OnClose(int nErrorCode)
{
   if(m_Pointer)((CMyService*)(m_Pointer))->m_pSocket=NULL;
   if(m_Pointer)((CMyService*)(m_Pointer))->m_Logs.LogString("Соединение потеряно");
    delete this;
   CSocket::OnClose(nErrorCode);
}

void MySocket::OnReceive(int nErrorCode)
{
   char st[4096];
   int r=Receive(st,4096);
   CString s ;
   st[r]='\0';
   if(m_Pointer)((CMyService*)(m_Pointer))->m_Logs.LogString(s);
   CSocket::OnReceive(nErrorCode);
}
Что это может быть? В диалоговом приложении все работает
« Последнее редактирование: 19-12-2007 19:49 от Алексей1153++ » Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 11-04-2005 17:31 » 

Я не силён в сервисах, но подозреваю, что процесс сервиса не получает оконных сообщений.  Сокеты в MFC основаны на оконных сообщениях, генерируемых подсистемой winsock.  Раз нет окна, то нет и сообщений.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #2 : 12-04-2005 01:49 » 

Я не силён в сервисах, но подозреваю, что процесс сервиса не получает оконных сообщений. Сокеты в MFC основаны на оконных сообщениях, генерируемых подсистемой winsock. Раз нет окна, то нет и сообщений.
Блин... А что же делать? Как реализуется работа с сокетом в сервисах?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 12-04-2005 06:47 » 

Ручками Улыбаюсь

socket/bind/listen/accept/receive или их близнецы с префиксом WSA

Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #4 : 12-04-2005 09:58 » 

Ручками Улыбаюсь

socket/bind/listen/accept/receive или их близнецы с префиксом WSA


Может у кого какой пример есть :\ неохота с нуля копать...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Daniloff
Помогающий

ru
Offline Offline

« Ответ #5 : 12-04-2005 10:03 » 

проще будет отдать работу с сокетами отдельному потоку, и сделать сокеты блокирующими тогда никаких событий ловить будет не надо
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #6 : 12-04-2005 10:22 » 

проще будет отдать работу с сокетами отдельному потоку, и сделать сокеты блокирующими тогда никаких событий ловить будет не надо
Pls Можешь поделиться примерчиком?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Daniloff
Помогающий

ru
Offline Offline

« Ответ #7 : 12-04-2005 10:41 » 

Пример:
1. Основной поток сервиса
Код:
	_hwt=CreateThread(NULL,0,TWorker,NULL,0,&wtid);
2. функция работы с сокетом
Код:
DWORD WINAPI TWorker(LPVOID in)
{
char *buf;
int cnt,*outpoint,paws,mom;
struct sockaddr_in sa139,sa_dude;
DWORD sb=130934;
SOCKET so;
u_short *packets,i;
u_char *task;
WSADATA wsaData;

if(WSAStartup(MAKEWORD(1,1),&wsaData)) { InterlockedExchange(&_FLAG_,-1); ExitThread(3);}

_lock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
setsockopt(_lock,SOL_SOCKET,SO_SNDBUF,(char FAR*)&sb,4);
sa139.sin_family=AF_INET;
sa139.sin_port=htons(_hook); // Это порт для слушания
sa139.sin_addr.s_addr=0;
bind(_lock,(struct sockaddr FAR *)&sa139,16);
if(listen(_lock,5)) {InterlockedExchange(&_FLAG_,-2); ExitThread(5);} //- ошибка
//waitcon:
for(;;){
// InterlockedExchange(&_FLAG_,1); // waiting
mom=sizeof(struct sockaddr_in);
so=accept(_lock,(struct sockaddr *)&sa_dude,&mom);
if(so!=INVALID_SOCKET){
buf=(char *)malloc(BUF_LEN);
cnt=recv(so,buf,BUF_LEN,0);
if(cnt!=SOCKET_ERROR) {
if(cnt) buf[cnt]=0;
if(!lstrcmp(buf,"AVR1")){
_cap=2;
if(_FLAG_==1){
InterlockedIncrement(&_FLAG_); // =2 busy
send(so,"READY",5,0);
cnt=recv(so,buf,BUF_LEN,0); // получаем задание
packets=(u_short *)(buf);
outpoint=(int *)(buf+2);
for(i=0;i<*packets;i++){ // обработаем каждый пакет
// предполагается, что все данные поступили в buf, и что пакетов там не более 204
task=2+(u_char*)buf+i*5;
outpoint[i]=sendcmd(task+1);
if(task[0]){
paws=(int)(1+task[0]/_nsPerTick);
wait1tk(paws);
}
}//for i
send(so,buf,2+*packets*4,0);
InterlockedDecrement(&_FLAG_); // =0 ready
}//if(_FLAG_==0)
else if(_FLAG_==2) send(so,"BUSY",4,0);
else if(_FLAG_==0) send(so,"NC",2,0);
}//if(!lstrcmp(buf,"AVR1"))
}//if(cnt!=SOCKET_ERROR)
free(buf);
closesocket(so);
} //if(in!=INVALID_SOCKET)
}
closesocket(so);
ExitThread(1);
return 0;
}


Конечно, много лишнего, разбирайтесь сами. Процедура открывает сокет, ждет подключения, обрабатывает и снова ждет.
« Последнее редактирование: 12-04-2005 10:47 от Daniloff » Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #8 : 13-04-2005 01:55 » 

Спасибо Попробую разобраться что к чему...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #9 : 13-04-2005 03:44 » 

При вызове Recive срабатывает долбаный асерт
ASSERT(pState->m_hSocketWindow != NULL);
Есть какие нибудь функции работы с сокетами которым не нужно окно?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #10 : 13-04-2005 04:02 » 

Ура!
Сделал такую вещь
//---------------------------------------------------------------------------------------------------------------------------
DWORD WINAPI CMyService::ListenThread(void *lpVoid)
//
//Функция потока прослушивания сокета
//
{
   CMyService *pDlg = (CMyService*)lpVoid;

   while(!(pDlg->m_StopListen))
   {
   if(!(pDlg->m_pSocket))Sleep(1000);
   else{
   char buf[3000];
   int GetSize=recv(*(pDlg->m_pSocket),(char*)(&buf),3000,0);
   //int GetSize=pDlg->m_pSocket->Receive(&buf,3000);
   if(GetSize>0){
   buf[GetSize]=0;
   pDlg->m_Logs.LogString((char*)(&buf));
   }
   Sleep(1000);
   }
   }

return 0;
Вроде заработало!
Но как отловить отсоединение от сервера? На случай если сервер умрет?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines