AmendHub

Download (as of this amendment):

julienxx

/

EasyNet

/

amendments

/

4

non blocking with timeout


julienxx made amendment 4 about 17 hours ago
--- HelloWorld.c Sun Oct 25 15:19:05 2026 +++ HelloWorld.c Sun Oct 25 16:19:21 2026 @@ -8,13 +8,31 @@ #include <stdio.h> #include <string.h> +#include <Events.h> #include <OpenTransport.h> #include <OpenTptInternet.h> #define kHost "typed-hole.org" #define kPort 79 -#define kQuery "textfile\015\012" /* textfile + CRLF */ +#define kQuery "julien\015\012" /* julien + CRLF */ +#define kTimeoutTicks (15 * 60) +static void GiveTime(void) +{ + EventRecord event; + + WaitNextEvent(0, &event, 1, NULL); +} + +static void ReportDisconnect(EndpointRef ep) +{ + TDiscon discon; + + OTMemzero(&discon, sizeof(discon)); + OTRcvDisconnect(ep, &discon); + printf("Connection failed: %ld\n", discon.reason); +} + int main(void) { OSStatus err; @@ -26,6 +44,8 @@ int main(void) OTResult result; OTResult event; OTFlags flags; + UInt32 deadline; + char addrString[16]; char buf[512]; err = InitOpenTransport(); @@ -40,7 +60,7 @@ int main(void) goto done; } - err = OTInetStringToAddress(inetServices, "example.com", &hostInfo); + err = OTInetStringToAddress(inetServices, kHost, &hostInfo); if(err != noErr){ printf("DNS lookup failed: %ld\n", err); goto done; @@ -68,12 +88,44 @@ int main(void) sndCall.addr.buf = (UInt8 *) &addr; sndCall.addr.len = sizeof(InetAddress); + OTInetHostToString(hostInfo.addrs[0], addrString); + printf("Address: %s port %d\n", addrString, kPort); + + printf("Connecting...\n"); err = OTConnect(ep, &sndCall, NULL); - if(err != noErr){ + if(err == kOTLookErr){ + event = OTLook(ep); + if(event == T_DISCONNECT){ + ReportDisconnect(ep); + } else { + printf("OTConnect: unexpected event %ld\n", event); + } + goto done; + } + if(err != noErr && err != kOTNoDataErr){ printf("OTConnect failed: %ld\n", err); goto done; } + deadline = TickCount() + kTimeoutTicks; + while(err == kOTNoDataErr){ + event = OTLook(ep); + if(event == T_CONNECT){ + err = OTRcvConnect(ep, NULL); + } else if(event == T_DISCONNECT){ + ReportDisconnect(ep); + } else if(TickCount() > deadline){ + printf("Connect timed out\n"); + goto done; + } else { + GiveTime(); + } + } + if(err != noErr){ + printf("OTRcvConnect failed: %ld\n", err); + goto done; + } + /* send query */ result = OTSnd(ep, kQuery, strlen(kQuery), 0); if(result < 0){ @@ -82,12 +134,22 @@ int main(void) } /* read until conn closed */ + deadline = TickCount() + kTimeoutTicks; for(;;){ result = OTRcv(ep, buf, sizeof(buf) - 1, &flags); - if(result < 0) + if(result > 0){ + buf[result] = '\0'; + printf("%s", buf); + deadline = TickCount() + kTimeoutTicks; + } else if(result == kOTNoDataErr){ + if(TickCount() > deadline) { + printf("\nReceive timed out\n"); + goto done; + } + GiveTime(); + } else { break; - buf[result] = '\0'; - printf("%s", buf); + } } /* handle disconnect */