![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неблокирующий режим в сокетах [D6, WinXP]
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);
Может поможет