Модераторы: feodorv

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна помощь, При работе с сокетами Windows 
:(
    Опции темы
vikaz
Дата 19.12.2008, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: нет
Всего: 12



Спасибо, гляну на выходных. Там будет видно! smile


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
vikaz
Дата 22.12.2008, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 869
Регистрация: 15.2.2006

Репутация: нет
Всего: 12



Всем привет! Посмотрел я статью, не очень много полезной информации я там нашел ДЛЯ СЕБЯ. 
Возникли вопросы и опять же по серверной части:
 - Как мы уже выяснили в конце функции main есть строка принимающее сообщение, но я так и не нашел строки, которая отправляет полученное сообщение клиенту. Зато нашел еще одну функцию для приема, это так и нужно или......?
Код

if(GetQueuedCompletionStatus(hport, &bytes, &key, &overlapped, INFINITE)) 
   {
    // Операция завершена успешно
   ovpConnection * op = (ovpConnection*)overlapped;
// Определяем тип завершенной операции и выполняем соответствующие действия
   switch(op->op_type) 
{
      //Завершена отправка данных
      case ovpConnection::op_type_send:
      delete [] op->buffer;
      delete op;
      break;
      //Завершен приём данных
      case ovpConnection::op_type_recv:
      if(!bytes) 
{
//Соединение с данным клиентом закрыто
            ClientList.remove(op->sock_handle);
            closesocket(op->sock_handle);
            strcpy(buffer,"Клиент № %d отключился, активных клиентов %d\n");
            CharToOem(buffer,buffer);
            printf(buffer,op->client_number,ClientList.size());
            break;
       }
   op->buffer[bytes]='\0';
   if(op->buffer[0]=='*')    //Звездочка * - признак приема сообщения, которое 
//должно быть переслано всем подключенным клиентам
   {
   strcpy(buffer,"От клиента № %d получено сообщение для всех  %s\n");
   CharToOem(buffer,buffer);
   printf(buffer,op->client_number,(op->buffer+1));
   SendToAll(op->buffer, bytes);  //Отправляем данные всем
   }
   else
   {
   strcpy(buffer,"От клиента № %d получено сообщение %s\n");
   CharToOem(buffer,buffer);
   printf(buffer,op->client_number,op->buffer);
   }
  unsigned long b;
   WSABUF buf;
   buf.buf = op->buffer;
   buf.len = BUFF_SIZE;   // buffer_len – постоянная величина
   err=WSARecv(op->sock_handle, &buf, 1, &b, &flags, op, 0); 
   if(!err)
   {
   strcpy(buffer,"Ошибка ф-ции WSARecv");
   CharToOem(buffer,buffer);
   printf("%s %d\n",buffer, WSAGetLastError());
   }
   }


Вопрос собственно вот в этом месте:
Код

 unsigned long b;
   WSABUF buf;
   buf.buf = op->buffer;
   buf.len = BUFF_SIZE;   // buffer_len – постоянная величина
   err=WSARecv(op->sock_handle, &buf, 1, &b, &flags, op, 0); 
   if(!err)
   {
   strcpy(buffer,"Ошибка ф-ции WSARecv");
   CharToOem(buffer,buffer);
   printf("%s %d\n",buffer, WSAGetLastError());
   }


И еще, я так и не въехал, про 4 байта, где они там у тебя передаются. Это все про то, что передается только одно сообщение от клиента И что еще интересного. Моя антивирусная программа, определяет код сервера как вирус. smile

Это сообщение отредактировал(а) vikaz - 22.12.2008, 10:38


--------------------
user posted image

Нет ничего настолько исправного, чтобы в нем не было ошибок. /Ф. Петрарка/ 
PM MAIL ICQ Skype   Вверх
Олег2005
Дата 22.12.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 421
Регистрация: 26.5.2005
Где: Рига Латвия

Репутация: 6
Всего: 11



В ссылке есть такая фраза:
С повторной отправкой сообщения от клиента серверу я разобрался.
Так что флаг и вам в руки......
Я уже не помню что там и как - давно писалось, и не мной лично, а одним коллегой. 
А насчет антивирусника?
 Так это его проблемы - а не программы. В коде программы нет ничего и близко подобного.....

Добавлено через 3 минуты и 12 секунд
Цитата(vikaz @  22.12.2008,  06:39 Найти цитируемый пост)
И еще, я так и не въехал, про 4 байта, где они там у тебя передаются

Из ссылки:
есть только одна засада, с которой я бился пару дней пока случайно не догадался, у меня пакет устроен так:
1. 4 байта это размер тела пакета
2. тело пакета.
соответственно на сервере строго сначала читаю 4 байта, а потом читал столько, сколько было прислано клиентом.

Это сообщение отредактировал(а) Олег2005 - 22.12.2008, 23:29
PM MAIL WWW MSN   Вверх
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0707 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.