wychwytywanie błędu 10053 w winsocku

0

Chcę napisać w winsocku prosty program, który po rozłączeniu będzie łączył się ponownie. Mam neostradę więc rozłączenia następują od czasu do czasu i nie chcę, żeby moje aplikacje internetowe przestawały działać. Rozłączenie generuje błąd 10053. Napisałem więc kod:
if recv(Gniazdo, Bufor, 1, 0) = SOCKET_ERROR then
begin
if WSAGetLastError = 10053 then
begin
//tutaj następuje ponowne połączenie
end;
end else
begin
//tutaj normalna analiza odebranych danych
end;
Próbowałem zmieniać socket na nieblokujący, ale niczego to nie zmienia... podczas utraty połączenia z internetem nic się nie dzieje. Z góry dziękuję za pomoc.

0

Jemu chyba chodzi o czysty winsock. Może tego WSAGetLastError nie trzeba umieszczać w ifie?

//meaculpa :) juz sie skasowalem :) - lofix

0

A nie powinienes jeszcze sprawdzic 10051 (czyli nie mozna sie polaczyc)? Nastepuje rozlaczenie, 10053 dostaje raz, probuje sie polaczyc, wywala 10051 i koniec ... czyli dzianie sie niczego - to taka moja teoia :-P

0

Teraz, w celach testowych przekształciłem kod do postaci:
if recv(Gniazdo, Bufor, 1, 0) = SOCKET_ERROR then
ShowMessage(IntToStr(WSAGetLastError);
Przy rozłączaniu nie pokazuje absolutnie niczego... czy mógłby ktoś to przetestować? Dla leniwych dam pelniejszy kod:

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, WinSock;

...

var
Gniazdo: Integer; //ta zmienna z wiadomych powodów musi być globalna

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
WSAData: TWSAData;
Addr: TSockAddrIn;
begin
WSAStartup(257, WSAData);
Gniazdo := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
I := 1;
ioctlsocket(Gniazdo, FIONBIO, I);//ustawia socket w tryb nieblokujący, opcjonalne
FillChar(Addr, SizeOf(Addr), 0);
Addr.sin_family := AF_INET;
Addr.sin_addr.S_addr := inet_addr(PChar('194.149.231.143'));
Addr.sin_port := htons(110);
Connect(Gniazdo, Addr, SizeOf(Addr));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Bufor: Char;
begin
if recv(Gniazdo, Bufor, 1, 0) = SOCKET_ERROR then
ShowMessage(IntToStr(WSAGetLastError);
end;

Instrukcja obsługi: włączyć program, rozłączyć się z internetem, wcisnąć guzik i powiedzieć mi czy coś się dzieje... :) dałem ip serwera pocztowego gazeta.pl, bo on, jak każdy szanujący się serwer pop3, od razu po połączeniu wysyła powitanie. Z góry dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1