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] |
Hi Mark, in my email (https://sourceware.org/ml/cygwin/2017-12/msg00194.html) 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; again: for (i = 0; i < nports; ++i) { *portp = htons(port++); if (port > endport) port = startport; res = bind(sd, sa, salen); if (res >= 0 || errno != EADDRINUSE) break; } if (i == nports && startport != LOWPORT) { startport = LOWPORT; endport = STARTPORT - 1; nports = STARTPORT - LOWPORT; port = LOWPORT + port % (STARTPORT - LOWPORT); goto again; } mutex_unlock(&port_lock); 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. Raimund -----Ursprüngliche Nachricht----- Von: cygwin-owner@cygwin.com [mailto:cygwin-owner@cygwin.com] Im Auftrag von Mark Geisert Gesendet: Dienstag, 30. Januar 2018 10:05 An: cygwin@cygwin.com 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: cygwin-owner@cygwin.com [mailto:cygwin-owner@cygwin.com] Im > Auftrag von PAULUS, Raimund, TI-ABN > Gesendet: Dienstag, 9. Januar 2018 09:14 > An: cygwin@cygwin.com > 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. ..mark -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Attachment:
bindresvport.c
Description: bindresvport.c
-- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |