X-Recipient: archive-cygwin AT delorie DOT com DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:content-type :content-transfer-encoding:mime-version; q=dns; s=default; b=QKd jIat829DjlyPGrKIDLCs0ZJPVNTufAoLxvxOEhiS+qOzyj1rHwt6p2JDjPWnv/FJ +kqzvQMoeslKZgYEtikJJjd8XErN4LK8MxfOw53moyfr5KMLfJXKpHKCnWSkR//C 3kw92aNjQI8Twg5O74V47I+nxmw7sug/c0MtbPrQ= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:subject:date:message-id:content-type :content-transfer-encoding:mime-version; s=default; bh=A9QSD+Lr7 9XLuuJ5YuzsoRnvijA=; b=QULBZrB1I6JIwUepBfQVddlCTqz2ThMIDNjvfvj2z O9JcKcz2nmHh6sqXFagoEzPaTZjBgMmzC5/8pPByh8CnjRoCs1DPpb8rZFz7szIS wwYAPMKgEL1E9b54E/V/cmLrbucz76rcHMHJUQjPFFn8t3nbV6XDs3AqyJ1d4PYV NE= Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.8 required=5.0 tests=AWL,BAYES_00,CYGWIN_OWNER_BODY,GIT_PATCH_2,KAM_INFOUSMEBIZ,KAM_LAZY_DOMAIN_SECURITY,RCVD_IN_DNSWL_NONE autolearn=no version=3.3.2 spammy=connections, HX-HELO:sk:mailrel, stating, gesendet X-HELO: mailrelay.dillinger.de From: "PAULUS, Raimund, TI-ABN" To: "'cygwin AT cygwin DOT com'" Subject: Re: RPC clnt_create() adress already in use Date: Tue, 19 Dec 2017 14:35:00 +0000 Message-ID: <59D90AF8D70E9740907BACDE2BCB520836C7DD89@RESW102.resdom01.local> Content-Type: text/plain; charset="iso-8859-1" MIME-Version: 1.0 X-IsSubscribed: yes Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by delorie.com id vBJEZLEK027060 Hello Mark, in my earlier tests the lib and header files for tirpc was still there from the Cygwin-installation. I think, this could influence the results of the tests. Therefore i removed these files. From now on i used only the downloaded files from sourceforge (https://sourceforge.net/projects/libtirpc/files/libtirpc/). I tested libtirpc-0.3.2, libtirpc-1.0.1 and libtirpc-1.0.2. The results for all releases are the same. I needed the following sources: auth_none.c, auth_unix.c, authunix_prot.c, bindresvport.c, clnt_bcast.c, clnt_dg.c, clnt_generic.c, clnt_perror.c, clnt_vc.c, debug.c, getnetconfig.c, getnetpath.c, mt_misc.c, rpc_callmsg.c, rpc_commondata.c, rpc_generic.c, rpc_prot.c, rpcb_clnt.c, rpcb_prot.c, xdr.c, xdr_array.c, xdr_float.c, xdr_reference.c, xdr_rec.c, xdr_mem.c I had to change the following (already mentioned earlier): clnt_bcast.c (because POLLRDNORM, POLLRDBAND are already defined in /usr/include/sys/poll.h) : --> #ifndef POLLRDNORM # define POLLRDNORM 0x040 /* Normal data may be read. */ # define POLLRDBAND 0x080 /* Priority data may be read. */ --> #endif xdr.h (typedefs where missed): #include --> typedef __uint64_t u_quad_t; --> typedef __int64_t quad_t; My compile-flags: -D_GNU_SOURCE -D__GLIBC__ -D__linux__ If i build my test program with the sources above, the behavior is the same as with the Cygwin-libtirpc: the first RPC-connection is ok, the next call to clnt_create() delivers the error EADDRINUSE. The test program on a Linux-box works perfectly. With "netstat -n" you can see each connection from the client to the server creates a new pair of ports. On the server-side the pair is always the same (ports 111, 907). On the client-side however the ports differ from one connection to the other. When the connections are closed the ports remain in state TIME_WAIT. After a while they disappear. If the RPC-client (Cygwin) is running on a Windows-box, "netstat -n" shows the pair of ports for the first connection. The next connection attempt (clnt_create()) delivers: EADDRINUSE. In the sources you can see the following: clnt_create() calls the function bindresvport_sa() (in bindresvport.c). Here the port for the connection is determined: if (port == 0) { port = (getpid() % NPORTS) + STARTPORT; } and the socket is bound to the port: res = bind(sd, sa, salen); If this part is executed multiple times (loop) the port is always the same. The function bind() doesn't deliver an error (res = 0, maybe bind() doesn't work correctly?). Therefore the error is not detected until the call of connect() in function clnt_vc_create() (in clnt_vc.c). But here you can not correct the port. I tried the following: The call of setsockopt(., SO_REUSEADDR, .) before bind() doesn't change anything. The error still occurs. I found 2 approaches to avoid the error: 1. Before the call to bind() set the port to 0 (port = 0). The following bind() searches an unused port. 2. Set the port to 0 (port = 0). Do not call bind(). Later the call to connect() searches an unused port. I tested the two methods and the behavior was the same as the Linux-client. It obviously works correctly. But i'm not a network specialist and i don't know, if it's the best solution for the problem. Subsequently I downloaded the Cygwin-sources for libtirpc-0.3.2 and libtirpc-1.0.1. And here again, with the changes mentioned in the two approaches the RPC-connection works perfectly. The only difference her is: a connection does not create a pair of ports but only a single port (netstat -n). Greetings Raimund -----Ursprüngliche Nachricht----- Von: cygwin-owner AT cygwin DOT com [mailto:cygwin-owner AT cygwin DOT com] Im Auftrag von Mark Geisert Gesendet: Mittwoch, 22. November 2017 22:55 An: cygwin AT cygwin DOT com Betreff: Re: WG: RPC clnt_create() adress already in use (3rd attempt at sending this) PAULUS, Raimund, TI-ABN wrote: > Hello Mark, > > is there any news with respect to libtirpc? Very important: I need it in Cygwin 2.5.1. I neglected to report what I found; sorry for that. The difference(s) between the vanilla libtirpc 1.0.1 that you downloaded and the one supplied by Cygwin are due to the patches applied as part of the Cygwin build. If you have the Cygwin package's source downloaded and unpacked with 'cygport prep' you can find these patches in /usr/src/libtirpc-1.0.1-1.src. I noticed one of the patches is a security fix. I suspect one or more of these patches are causing the difficulty you're having but I don't know enough about RPC in general to set up a test environment and can't devote time to digging further. This is as far as I can go. Apologies again for not stating this. Regards, ..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 -- 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