Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Socket,ы обработка сообщений


Автор: Алкоголик 21.2.2008, 13:28
Здраствуйте.
Пишу серверную прогу(на Сокетах). Возник вопрос как серверсокет сохраняет сообщения? Т.е. приходят сообщения от клиентов. Он должен задать вопрос базе и отослать ответ клиенту(да/нет). Вот и возник вопрос: если сервер обрабатывает одну задачу, а тут приходит другое он будет ждать в очереди или что..?
Заранее спасибо.

Автор: SneG0K 21.2.2008, 23:46
Чтобы сервер мог сразу обрабатывать несколько задач, переведи сокет в неблокирующий режим...
 
Код

s:=soccket(AF_INET,SOCK_STREAM,0);
iMode:=1;
ioctlsocket(s,FIONBIO,iMode);


А далее уже обрабатывай приходящие сообщения... Лучше всего такие сообщения обрабатывать через case..of..end

Автор: Алкоголик 22.2.2008, 07:38
Благодарю.
И еще просьба дайте код, как избавиться от ошибки, которая возникает на клиенте, когда он неможет соединьться с сервером.

P.S. А лучше всего работающий исходник реализации Клиент/Сервера с обработкой исключений... А то немогу найти ничего кроме чата, а он не совсем то. что нужно...  Так же можно с использованием Indy

Автор: SneG0K 23.2.2008, 01:05
Эх.. молодеж  smile .... полный код я тебе не дам(облом в сорцах рытся), но если клиент не смог подключится, то он возвращает ошибку WSACONNREFUSED

Вот ниже представляю тебе код, для тестирования ошибок, которые могу происходить во время работы библиотеки висок...
Код

procedure TestWinSockError;
    var
     iErr:integer;
     sFullErr:string;
    begin
     sFullErr:='Неизвестная ошибка';
     iErr:=WSAGetLastError;
      case iErr of
       WSASYSNOTREADY:sFullErr:='Основная сетевая подсистема не готова к запуску';
       WSAVERNOTSUPPORTED:sFullErr:='Версия библиотеки не поддерживается';
       WSAEFAULT:sFullErr:='Превышен предел поддерживаемых ОС задач';
       WSAEINPROGRESS:sFullErr:='Выполняется операция в блокирующем режиме, необходимо дождаться её окончания';
       WSANOTINITIALISED:sFullErr:='Сначала надо инициализировать WinSock';
       WSAENETDOWN:sFullErr:='Связь нарушена. Возможно было утеряно соединение с интернетом';
       WSAEAFNOSUPPORT:sFullErr:='Запрашиваемая адресация (значение параметра af) не поддерживается';
       WSAEMFILE:sFullErr:='Ресурс доступных дескрипторов исчерпан';
       WSAENOBUFS:sFullErr:='Недостаточно памяти буфера и сокет не может быть создан';
       WSAEPROTONOSUPPORT:sFullErr:='Протокол не поддерживатся';
       WSAEPROTOTYPE:sFullErr:='Неверный тип спецификации (параметр type) для выбранного протокола';
       WSAESOCKTNOSUPPORT:sFullErr:='Указанный тип сокета не поддерживается заданной адресацией';
       WSAEINVAL:SFullErr:='Сокет уже связан с адресом или не был связан';
       WSAENOTSOCK:sFullErr:='Неверный дескриптор сокета';
       WSAEISCONN:sFullErr:='Сокет уже подключен';
       WSAHOST_NOT_FOUND:sFullErr:='Ответа от компьютера с таким адрессом нет';
       WSATRY_AGAIN:sFullErr:='Ошибка сервера. Попроробуйте еще раз повторить попытку';
       WSANO_RECOVERY:sFullErr:='Появилась ошибка которую нельзя устранить';
       WSANO_DATA:SFullErr:='Имя существует, но нет записи нужного типа';
       WSAEINTR:sFullErr:='Функцией WSACancelBlokingCall отменен блокирующий вызов';
       WSAEALREADY:sFullErr:='Указанный сокет занят неблокирующей оперцией';
       WSAENETUNREACH:SFullErr:='Сеть недоступна в данный момент';
       WSAETIMEDOUT:sFullErr:='Исчерпано время ожидания от сервера. Повторите операцию через некоторое время';
       WSAECONNREFUSED:sFullErr:='Сервер отклонил подключение или он не прослушивает этот порт';
       WSAEWOULDBLOCK:sFullErr:='Сокет создан как неблокирующий, и в данный момент операция не может ыбть завершена';
       WSAEACCES:SFullErr:='Попытка соединеня пакетным сокетом к широковещательному адрессу невозможна, потому что не включен параметр SO_BROADCAST';
       WSAESHUTDOWN:sFullErr:='Сокет закрыт';
       SD_RECEIVE:SFullErr:='0';
      end;
       Application.MessageBox(PChar(sFullErr),'Внимание!!!');
    end;


В тех местах где может происходить ошибка вызываю эту процедуру... Например так
Код

var
Sock:TSocket;
.............
sock:=socket(AF_INET,SOCK_STREAM,IPPROTO_IP);
 if sock<>0 then TestWinSockError;


Ну или же допустим при отправке\инициализации и т.д. 

Эта процедура всегда возвратит тебе код ошибки... конечно-же эта процедура не полная и не идеальная, но содержит основные ошибки(на моё усмотрение), которые могут возникать при работе с сокетами...


Цитата(Алкоголик @  22.2.2008,  06:38 Найти цитируемый пост)
И еще просьба дайте код, как избавиться от ошибки, которая возникает на клиенте, когда он неможет соединьться с сервером.
Избавится от ошибки ты просто так не сможеш, ошибки ведь разные бывают smile Переделай мою процедуру так, чтобы она не показывала ошибку, а исправляла её smile Допустим если возникла ошибка WSANOTINITIALISED, то никто не мешает внести в case такой код 
Код

WSAStartup(MAKEWORD(1,1),WSAData);

Удачи....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)