This is the mail archive of the
cygwin
mailing list for the Cygwin project.
RPC clnt_create() adress already in use
- From: "PAULUS, Raimund, TI-ABN" <Raimund dot Paulus at dillinger dot biz>
- To: "'cygwin at cygwin dot com'" <cygwin at cygwin dot com>
- Date: Fri, 22 Sep 2017 07:21:56 +0000
- Subject: RPC clnt_create() adress already in use
- Authentication-results: sourceware.org; auth=none
In our environment we have a Linux-Server and several Windows-PCs (Windows XP SP3, in the past Windows NT too). On the Linux-Server RPC-Services (Remote Procedure Call) are running, one service for one Windows-PC each. To build the RPC-clients on the Windows-boxes, I used Cygwin 1.5.18 and actually Cygwin 2.5.1 (because we now have Windows 7 too).
The RPC-Client (*.exe) on the Windows-box is started at any time by hand, establishes a connection to the server (clnt_create), executes a few calls to the server (clnt_call), closes the connection (clnt_destroy) and exits. The time-interval between the program starts can be 10 seconds up to 2 minutes.
This worked over many years without any error (Cygwin 1.5.18).
Now I upgraded to Cygwin 2_5_1 (libtirpc instead librpc) and there are problems. Sometimes the RPC-Client cannot establish a connection to the server. The error message from clnt_spcreateerror():
Remote system error - Address already in use
I think it is "EADDRINUSE".
I wrote a program for tests in Cygwin 1.5.18, 1.7.32 and 2.5.1:
The program reads argv[1] as a sleeptime. If no argv[1] exists, sleeptime has a default value of 10 seconds. Afterwards is a loop (20 times) of the following actions:
- establish a connection to the server and sleep for 1 second
- destroy the connection
- sleep(sleeptime)
test_rpc.c:
/*=================*/
/* Include-Files */
/*=================*/
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
/*#include <posix.h>*/
#include <sys/types.h>
#include <sys/stat.h>
#include <rpc/rpc.h>
/*===========================================*/
/* global definitions */
/*===========================================*/
char local_errmsg[512];
char host[] = "nazv";
u_int prognum = 0x2000002F;
u_int versnum = 2;
char nettype[] = "tcp";
/*=============================*/
/* main-program */
/*=============================*/
int main (int argc, char *argv[])
{
int retval = 0;
int sleeptime = 0;
CLIENT *cl; /* a client handle */
// read sleep-Time
if(argc < 2)
{
printf("no input for sleep-Time --> default\n");
sleeptime = 10;
}
else
{
char *endptr;
errno = 0;
sleeptime = (int)strtol(argv[1], &endptr, 10);
if ( (errno == ERANGE && (sleeptime == LONG_MAX || sleeptime == LONG_MIN))
|| (errno != 0 && sleeptime == 0))
{
fprintf(stderr, "input for sleeptime (%s) invalid: %s\n",
argv[1], strerror(errno));
exit(1);
}
}
printf("sleep-Time = %d \n", sleeptime);
// loop for 20 connection
for(int i=0; i<20; i++)
{
if(!(cl = clnt_create(host, prognum, versnum, nettype)))
{
// couldn't start client handle
sprintf(local_errmsg, "%s: %s", host, clnt_spcreateerror("clnt_create"));
retval = -1;
break;
}
printf("connection nr. %d established \n", i+1);
sleep(1);
clnt_destroy(cl);
printf("connection closed\n");
printf("wait for %d sec.\n", sleeptime);
sleep(sleeptime);
};
if(retval < 0)
fprintf(stderr, "%s\n", local_errmsg);
return(0);
} // end main()
Test 1: The program is started with argument "60" (sleep = 60 secs.)
Results:
Cygwin 1_5_18 (Windows XP, Windows 7)
The loop is completed without error (20 times the connection was opened and closed).
Cygwin 1_7_32 and 2_5_1 (Windows 7)
After the first connection is closed, a second connection in the loop is not possible (error message above) and the program exits.
RPC-Client on Linux (openSuSe Leap 42.1)
The loop is completed without error (20 times the connection was opened and closed).
Test 2: The program is started with argument "0" (sleep = 0 secs.)
Results:
Cygwin 1_5_18 (Windows XP, Windows 7)
The loop is completed without error (20 times the connection was opened and closed).
Cygwin 1_7_32 and 2_5_1 (Windows 7)
After the first connection is closed, a second connection in the loop is not possible (error message above) and the program exits.
RPC-Client on Linux (openSuSe Leap 42.1)
The loop is completed without error (20 times the connection was opened and closed).
Test 3: The program is started with argument "0" (sleep = 0 secs.)
Windows 7 only
Cygwin 1_7_32 and 2_5_1
After the program exited with the error, the program was immediately restarted. The start was ok (but always the program exited with the known error). But after several starts a new error was there:
Remote system error - Connection timed out
What is the reason for the error? I have to develop RPC-Clients for Windows XP SP3 and Windows 7.
Raimund Paulus