This is the mail archive of the cygwin mailing list for the Cygwin project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: RPC clnt_create() adress already in use

Hi Mark,

in my email ( i described 2 approaches. I prefer  nr 1.
Here the part of the source in bindresvport.c:
        if (port == 0) {
                port = (getpid() % NPORTS) + STARTPORT;
        res = -1;
        errno = EADDRINUSE;

/* fix for bind() */
port = 0;
        for (i = 0; i < nports; ++i) {
                *portp = htons(port++);
                 if (port > endport)
                        port = startport;
                res = bind(sd, sa, salen);
                if (res >= 0 || errno != EADDRINUSE)
        if (i == nports && startport != LOWPORT) {
            startport = LOWPORT;
            endport = STARTPORT - 1;
            nports = STARTPORT - LOWPORT;
            port = LOWPORT + port % (STARTPORT - LOWPORT);
            goto again;

        return (res);

This causes bind() to search an unused port. I use libtirpc with this fix since several weeks and it works for me. I don't know an other way (fixing Cygwin) to success.
The RPC-client on my pc is started every few minutes and has to connect to the RPC-server.  Without the fix libtirpc is not usable and I have to use Cygwin 1.5.18 with the old librpc.


-----Ursprüngliche Nachricht-----
Von: [] Im Auftrag von Mark Geisert
Gesendet: Dienstag, 30. Januar 2018 10:05
Betreff: Re: RPC clnt_create() adress already in use

PAULUS, Raimund, TI-ABN wrote:
> Hi Mark,
> as Corinna wrote in the thread " Cygwin socket option SO_REUSEADDR operates unlike Linux", the cause for the problem in libtirpc is Microsofts implementation of socket handling. If i implement a simple socket client, that is not so much of an issue, because I call the functions separately and can handle the error. Moreover in this case bind() is not necessary.
> But in the case of libtirpc the implementation of clnttcp_create() determines the sequence of bind() and connect() for the local port and you cannot correct the error of bind() after the call of connect(). Therefore I think best is to set the port number to zero (port = 0) before the call to bind().
> Raimund
> -----Ursprüngliche Nachricht-----
> Von: [] Im 
> Auftrag von PAULUS, Raimund, TI-ABN
> Gesendet: Dienstag, 9. Januar 2018 09:14
> An:
> Betreff: WG: AW: RPC clnt_create() adress already in use

Hi Raimund,
Where, exactly, would you set the port number to zero?  I can imagine how this would solve the problem you're seeing but I'm concerned about other use cases.

It also seems a little odd to me we'd be making a Cygwin-specific patch rather than "fixing" Cygwin itself so the patch would not be necessary.  But I don't feel strongly either way here.  libtirpc already has Cygwin-specific patches.


Problem reports:
Unsubscribe info:

Attachment: bindresvport.c
Description: bindresvport.c

Problem reports:
Unsubscribe info:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]