Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

winsock2 клиент сервер connect 10035


Rembo ©   (2008-08-23 12:24:00) 

Пишу я значит чат, взял пример серва из статьи королевства, там где неблокирующий режим с сообщениями, серв норм пашет, а клиент при конекте (на клик кнопки) выдает еррорину 10035, но все же конектиться (серв говорит) и с клиента текст шлеться а с серва на клиент не идет, или идет но не отображаеться (сообщения глючат по ходу). Клиент у меня тож неблокающие сокеты юзает (мож и зря ну не знаю). Если это реально, хотелось бы клиент сделать в блокирующем режиме с сообщениями...

Текст выше написал чтоб код ниже не читать (многа букаф), проблема вроде расспастраненная, сори за слэнг, настроение такое.
А вот код (КЛИЕНТ):
...
const
 WM_SocketEvent=WM_User+1;
...
WSAStartup($101,Data);
SK:=Socket(AF_Inet,Sock_Stream,0);
Addr.sin_family:=AF_Inet;
addr.sin_port:=HtoNS(7790);
Addr.sin_addr.S_addr:=Inet_Addr('127.0.0.1');
FillChar(Addr.sin_zero,SizeOf(Addr.sin_zero),0);
//Bind(SK,@Addr,SizeOf(Addr)); - хз надо это или не
WSAAsyncSelect(SK,Handle,
     WM_SocketEvent,FD_Read or FD_Close or FD_CONNECT or FD_Accept);
...
procedure TForm1.WMSocketEvent(var Msg:TMessage);
var Sock:TSocket;
    SockError:Integer;
 begin
  Sock:=TSocket(Msg.WParam);
  SockError:=WSAGetSelectError(Msg.lParam);
  if SockError<>0 then
   begin
   memo1.lines.add('['+inttostr(SockError)+']Ошибка! Закрываем сокет...');
    CloseSocket(Sock);
    Exit
   end;
  case WSAGetSelectEvent(Msg.lParam) of
   FD_Read:
    begin
     RECV(msg.WParam,buf,sizeof(buf),0);
     memo1.Lines.Add('Сообщение от сервера: '+buf);
    end;
   FD_Accept:
    begin
     memo1.lines.add('Подключен!');
    end;
   FD_Close:
    begin
     memo1.Lines.Add('Отключение от сервера');
     Shutdown(Sock,SD_Send);
     CloseSocket(Sock)
    end;
   FD_Connect:
     begin
     Connect(SK,@Addr,SizeOf(Addr));
     memo1.lines.add('Подключен!');
     end
  end
 end;

Сервер:
procedure TForm1.FormCreate(Sender: TObject);
var Data:TWSAData;
    Addr:TSockAddr;
 begin
  WSAStartup($101,Data);
  ServSock:=Socket(AF_Inet,Sock_Stream,0);
  Addr.sin_family:=AF_Inet;
  addr.sin_port:=HtoNS(7790);
  Addr.sin_addr.S_addr:=Inet_Addr('127.0.0.1');
  FillChar(Addr.sin_zero,SizeOf(Addr.sin_zero),0);
  Bind(ServSock,@Addr,SizeOf(Addr));
  Listen(ServSock,SOMaxConn);
  WSAAsyncSelect(ServSock,Handle,
                 WM_SocketEvent,FD_Read or FD_Accept or FD_Close);
end;

procedure TForm1.WMSocketEvent(var Msg:TMessage);
var Sock:TSocket;
    SockError:Integer;
 begin
  Sock:=TSocket(Msg.WParam);
  SockError:=WSAGetSelectError(Msg.lParam);
  if SockError<>0 then
   begin
    CloseSocket(Sock);
    memo1.lines.add('['+inttostr(SockError)+']Ошибка! Закрываем сокет...');
    Exit
   end;
  case WSAGetSelectEvent(Msg.lParam) of
   FD_Read:
    begin
      RECV(msg.WParam,buf,sizeof(buf),0);
      memo1.Lines.Add('Сообщение от клиента: '+buf);
      buf:='Сообщение получено! ('+buf+')';
      Send(msg.WParam,buf,sizeof(buf),0);
    end;
   FD_Accept:
    begin
     Accept(Sock,nil,nil);
     memo1.lines.add('['+inttostr(WSAGetLastError)+']Клиент подключен');
    end;
   FD_Close:
    begin
     Shutdown(Sock,SD_Send);
     CloseSocket(Sock);
     memo1.lines.add('['+inttostr(SockError)+']Клиент отключился...');
    end
  end
 end;

Так вот проблема: ответ от серва в клиенте не выдает.
Заранее спасибо.


Григорьев Антон   (2008-09-15 12:09:00) [1]

Проще всего делать соединение в блокирующем режиме, а WSAAsyncSelect вызывать после Connect.


Сергей М.   (2008-09-14 16:02:00) [2]


> ass   (13.09.08 23:51) [8]


"Чуваки" - они в подворотне, за клинским бегают)


ass   (2008-09-13 23:51:00) [3]

Сергей умный чувак


Сергей М.   (2008-08-24 21:05:00) [4]


> а это уже эксперименты


А какие могут быть "экспереименты", если событие говорит о фактеконнекта ?


> КЛИЕНТ


> FD_Accept:


А это что за "эксперименты" ?

FD_ACCEPT - это событие исключительно сервернойстороны !
На стороне клиента оно никогда не возникнет.
Зато и на серверной и на клиентской сторонах крайневыжным является событие FD_WRITE, реакция  на которое у тебя отсутствует вообще.


Rembo   (2008-08-24 18:16:00) [5]

а это уже эксперименты, прежде чем сюда лезть пробовал по всякому, изначально конект был на кнопке а в FD_CONNECT его небыло, и выдавал ошибку.


grisme   (2008-08-24 12:05:00) [6]

а почему тогда у тебя в FD_CONNECT ещё раз вызывается connect? м?


Rembo   (2008-08-23 20:44:00) [7]

procedure TForm1.Button1Click(Sender: TObject);
begin
Connect(SK,@Addr,SizeOf(Addr));
end;


Тын-Дын   (2008-08-23 17:58:00) [8]


> а клиент при конекте (на клик кнопки)


Ну и где этот код при нажатии кноки? Код подключения?


Rembo   (2008-08-23 15:23:00) [9]

Пасиба, я знаю что оно означает, хотел бы узнать где ошибка в клиенте, почему он не отображает текст присылаемый с сервака


grisme   (2008-08-23 14:36:00) [10]

WSAEWOULDBLOCK

(10035)

Resource temporarily unavailable.

This error is returned from operations on non-blocking sockets that cannot be completed immediately, for example recv when no data is queued to be read from the socket. It is a non-fatal error, and the operation should be retried later. It is normal for WSAEWOULDBLOCK to be reported as the result from calling connect on a non-blocking SOCK_STREAM socket, since some time must elapse for the connection to be established.


Наверх

Титульная страница Поиск, карта сайта Написать письмо