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

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

Неблокирующий режим в сокетах [D6, WinXP]


Страницы:   1 2

kalishenko ©   (2004-05-28 19:39:00) 

Сокет никак не активизируется. Не пойму, почему. Вот пример:

const
     CLOSE_SOCK = 0;
     CONNECTING_SOCK = 1;
     CONNECTED_SOCK = 2;
     TIME_OUT = 30;
     maxproccess = 2;

var
 WSData: WSAData;
 Return: integer;
 Addr: TSockAddrIn;
 Buf: array [0..100] of char;
 sock : array [1..maxproccess] of TSocket;
 stat : array [1..maxproccess] of Byte;
 time : array [1..maxproccess] of Byte;
 x : integer;
 on_sock : LongInt = 1;
 off_sock : LongInt = 0;
 wfds_empty : Boolean;
 wfds : Tfdset;
 tv : Ttimeval;

procedure TForm1.Button4Click(Sender: TObject);
begin
 FillChar(Buf,100,0);

 WSAStartup($101,WSData);
 for x := 1 to maxproccess do
   stat[x] := CLOSE_SOCK;

 repeat
   for x := 1 to maxproccess do
   begin
     if stat[x] = CLOSE_SOCK then
     begin
       sock[x] := socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
       time[x] := TIME_OUT;
       Return := ioctlsocket(sock[x],FIONBIO,on_sock);
       addr.sin_family := AF_INET;
       addr.sin_port := htons(10001);
       addr.sin_addr.s_addr := INADDR_ANY;
       Return := connect(sock[x],addr,sizeof(addr));
       stat[x] := CONNECTING_SOCK;
     end;
   end;

   FD_ZERO(wfds);
   wfds_empty:=true;
   for x:=1 to maxproccess do
   begin
     if stat[x]=CONNECTING_SOCK then
     begin
       FD_SET(sock[x],wfds);
       wfds_empty:=false;
     end;
   end;

   if not wfds_empty then
   begin
     tv.tv_sec:=1;
     tv.tv_usec:=0;
     Return := select(0,nil,@wfds,nil,@tv);
   end;

   for x:=1 to maxproccess do
   begin
     if stat[x]<>CLOSE_SOCK then
     begin
       dec(time[x]);
       if time[x]=0 then
       begin
         MessageBox(0,'Ваше время вышло!','',MB_OK);
         stat[x]:=CLOSE_SOCK;
         ioctlsocket(sock[x],FIONBIO,off_sock);
         closesocket(sock[x]);
       end;
     end;

     if stat[x]=CONNECTING_SOCK then
     begin
       if FD_ISSET(sock[x],wfds) then
         stat[x]:=CONNECTED_SOCK;
     end;

     if stat[x]=CONNECTED_SOCK then
     begin
       MessageBox(0,'Привет!','',MB_OK);
       FD_CLR(sock[x],wfds);
       send(sock[x],buf,sizeof(buf),0);
       Form1.Caption := Buf;
       stat[x]:=CLOSE_SOCK;
       ioctlsocket(sock[x],FIONBIO,off_sock);
       closesocket(sock[x]);
     end;
   end;
   Application.ProcessMessages;
 until
   false;

 WSACleanup;
end;


kalishenko   (2004-05-28 20:25:00) [21]

Не, Вы наверное не так меня поняли. WSAStartUp здесь непричем. Все с ним нлормально. И сокеты открываются (sock[x] := socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);), и замечательно переходят в неблокирующий режим (Return := ioctlsocket(sock[x],FIONBIO,on_sock);), затем, как и в хелпе написано, connect выдает SOCKET_ERROR для неблок. режима (Return := connect(sock[x],addr,sizeof(addr));), но затем сокеты никак не хотят select-иться (Return := select(0,nil,@wfds,nil,@tv);), и функция FD_ISSET говорит, что сокет не установлен, поэтому условие (if FD_ISSET(sock[x],wfds) then stat[x]:=CONNECTED_SOCK;) не выполняется. А почему, не пойму.


SammIk   (2004-05-28 20:12:00) [22]

Попробуи
WSAStartup($0002,WSData);
Может поможет


Страницы:   1 2

Наверх

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