Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

winsock2 клиент сервер connect 10035   Найти похожие ветки 

 
Rembo   (2008-08-23 12:24) [0]

Пишу я значит чат, взял пример серва из статьи королевства, там где неблокирующий режим с сообщениями, серв норм пашет, а клиент при конекте (на клик кнопки) выдает еррорину 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;

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


 
grisme ©   (2008-08-23 14:36) [1]

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.


 
Rembo   (2008-08-23 15:23) [2]

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


 
Тын-Дын ©   (2008-08-23 17:58) [3]


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


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


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

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


 
grisme ©   (2008-08-24 12:05) [5]

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


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

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


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


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


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


> КЛИЕНТ


> FD_Accept:


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

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


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

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


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


> ass   (13.09.08 23:51) [8]


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


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

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



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.053 c
2-1275043106
kolian
2010-05-28 14:38
2010.08.27
запоминание и воспроизведение в окне memo


15-1264678479
Илья_
2010-01-28 14:34
2010.08.27
Norton Internet Security заблокировал и удалил файл SysConst.dcu


15-1273264199
Юрий
2010-05-08 00:29
2010.08.27
С днем рождения ! 8 мая 2010 суббота


2-1267359992
Алексей4105
2010-02-28 15:26
2010.08.27
Чтение файлы построчно без завершения на eof


15-1263936627
Юрий
2010-01-20 00:30
2010.08.27
С днем рождения ! 20 января 2010 среда





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский