[Cuis-dev] finding an open port

Mark Volkmann r.mark.volkmann at gmail.com
Thu Oct 24 17:01:17 PDT 2024


I landed on a solution that seems to work fine. Does this seem reasonable?

When I pass this 3000 and port 3000 is in use, it returns 3001.

openPortFrom: aNumber
    | hostAddress port socket |

    hostAddress := NetNameResolver addressForName: 'localhost'.
    port := aNumber.
    socket := Socket newTCP.

    [ true ] whileTrue: [
        [
            socket connectTo: hostAddress port: port waitForConnectionFor:
1.
            socket disconnect.
            port := port + 1.
        ] on: ConnectionTimedOut do: [ :ex | ^ port ].
    ].

On Thu, Oct 24, 2024 at 11:45 AM Jon Raiford via Cuis-dev <
cuis-dev at lists.cuis.st> wrote:

> For what it’s worth, the way I looked at his code was that the “listenOn:
> port” should have thrown an RTE as the OS knows immediately that the port
> is not available. Of course Mark’s code below doesn’t handle errors there,
> but that would have been resolved during debugging. Whether or not the rest
> of the code is sane is another matter entirely 😊.
>
>
>
> Jon
>
>
>
> *From: *Cuis-dev <cuis-dev-bounces at lists.cuis.st> on behalf of Gerald
> Klix via Cuis-dev <cuis-dev at lists.cuis.st>
> *Date: *Thursday, October 24, 2024 at 12:25 PM
> *To: *cuis-dev at lists.cuis.st <cuis-dev at lists.cuis.st>
> *Cc: *Gerald Klix <cuis.01 at klix.ch>
> *Subject: *Re: [Cuis-dev] finding an open port
>
> Dear Mark,
>
> why in name of Alan (Perlis) do you expect a connection to your newly
> created server socket pop out of nowhere?
>
> Increase the time out to 60 in `connected := socket
> waitForConnectionFor: 1 ifTimedOut: [ false ].`,
> send the #openPortFrom: message to your object.
>
> Switch to Terminal window, and start telnet like this
> `telnet 127.0.0.1 3000` and marvel at the results.
>
> Sorry for my harsh words: This issue has nothing to do with Cuis,
> but a lot with socket, bind and listen.
>
> See man 2 bind, man 2 listen
>
>
> Just my 0,01€,
>
> Gerald
>
>
>
> On 10/24/24 2:29 AM, Mark Volkmann via Cuis-dev wrote:
> > I wrote the following code to take a port number and return the first
> port
> > starting from that number that is open. For example, if ports 3000 and
> 3001
> > are in use and I send "MyClass openPortFrom: 3000" then I expect it to
> > return 3002. Can you spot why this never finds an open port and loops
> > forever?
> >
> > openPortFrom: aNumber
> > | connected port socket |
> >
> > connected := false.
> > port := aNumber.
> >
> > [ connected ] whileFalse: [
> > 'trying port {1}' format: { port } :: print.
> > socket := Socket newTCP.
> > socket listenOn: port.
> > connected := socket waitForConnectionFor: 1 ifTimedOut: [ false ].
> > connected ifTrue: [socket disconnect] ifFalse: [ port := port + 1 ].
> > ].
> >
> > ^port.
> >
> >
>
> --
> Cuis-dev mailing list
> Cuis-dev at lists.cuis.st
> https://lists.cuis.st/mailman/listinfo/cuis-dev
> --
> Cuis-dev mailing list
> Cuis-dev at lists.cuis.st
> https://lists.cuis.st/mailman/listinfo/cuis-dev
>


-- 
R. Mark Volkmann
Object Computing, Inc.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20241024/4899d4e6/attachment.htm>


More information about the Cuis-dev mailing list