AmendHub

Download (as of this amendment):

julienxx

/

EasyNet

/

amendments

/

3

synchronous call failing


julienxx made amendment 3 about 18 hours ago
--- HelloWorld.c Sun Oct 25 14:52:15 2026 +++ HelloWorld.c Sun Oct 25 15:19:05 2026 @@ -7,39 +7,107 @@ */ #include <stdio.h> +#include <string.h> #include <OpenTransport.h> #include <OpenTptInternet.h> +#define kHost "typed-hole.org" +#define kPort 79 +#define kQuery "textfile\015\012" /* textfile + CRLF */ + int main(void) { OSStatus err; - InetSvcRef inetServices; + InetSvcRef inetServices = NULL; InetHostInfo hostInfo; - char addrString[16]; + EndpointRef ep = kOTInvalidEndpointRef; + InetAddress addr; + TCall sndCall; + OTResult result; + OTResult event; + OTFlags flags; + char buf[512]; err = InitOpenTransport(); if(err != noErr){ - printf("InitOpenTransport failed %ld\n", err); + printf("InitOpenTransport failed: %ld\n", err); return 1; } inetServices = OTOpenInternetServices(kDefaultInternetServicesPath, 0, &err); if(err != noErr){ - printf("OTOpenInternetServices failed %ld\n", err); - CloseOpenTransport(); - return 1; + printf("OTOpenInternetServices failed: %ld\n", err); + goto done; } err = OTInetStringToAddress(inetServices, "example.com", &hostInfo); if(err != noErr){ printf("DNS lookup failed: %ld\n", err); + goto done; + } + + /* create TCP endpoint */ + ep = OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, NULL, &err); + if(err != noErr){ + printf("OTOpenEndpoint failed: %ld\n", err); + goto done; + } + OTSetSynchronous(ep); + OTSetBlocking(ep); + + /* bind to local addr */ + err = OTBind(ep, NULL, NULL); + if(err != noErr){ + printf("OTBind failed: %ld\n", err); + goto done; + } + + /* connect server */ + OTInitInetAddress(&addr, kPort, hostInfo.addrs[0]); + OTMemzero(&sndCall, sizeof(TCall)); + sndCall.addr.buf = (UInt8 *) &addr; + sndCall.addr.len = sizeof(InetAddress); + + err = OTConnect(ep, &sndCall, NULL); + if(err != noErr){ + printf("OTConnect failed: %ld\n", err); + goto done; + } + + /* send query */ + result = OTSnd(ep, kQuery, strlen(kQuery), 0); + if(result < 0){ + printf("OTSend failed: %ld\n", err); + goto done; + } + + /* read until conn closed */ + for(;;){ + result = OTRcv(ep, buf, sizeof(buf) - 1, &flags); + if(result < 0) + break; + buf[result] = '\0'; + printf("%s", buf); + } + + /* handle disconnect */ + if(result == kOTLookErr){ + event = OTLook(ep); + if(event == T_ORDREL){ + OTRcvOrderlyDisconnect(ep); + OTSndOrderlyDisconnect(ep); + } else if(event == T_DISCONNECT) { + OTRcvDisconnect(ep, NULL); + } } else { - OTInetHostToString(hostInfo.addrs[0], addrString); - printf("%s is %s\n", hostInfo.name, addrString); + printf("OTRcv failed: %ld\n", result); } - OTCloseProvider(inetServices); +done: + if(ep != kOTInvalidEndpointRef) + OTCloseProvider(ep); + if(inetServices != NULL) + OTCloseProvider(inetServices); CloseOpenTransport(); - return 0; } \ No newline at end of file