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 */