public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Videau Brice <brice.videau@imag.fr>
To: linux-kernel@vger.kernel.org
Subject: Strange connect behavior
Date: Mon, 30 Oct 2006 11:24:58 +0100	[thread overview]
Message-ID: <4545D2FA.3030802@imag.fr> (raw)

[-- Attachment #1: Type: text/plain, Size: 1034 bytes --]

Hello,

While writing some client server application in c, we noticed a strange 
behavior : if we try to connect endlessly to a given local port where 
nobody is listening, and if the port is >= to 32768, after several 
thousands tries ( Connection refused ) connect will return 0.
This behavior is not exhibited when port is < 32768.

We confirmed this behavior in kernel 2.6.17-10, 2.6.18-1, 2.6.8, on x86 
and 2.4.21-32 on ia64, on several hardware configurations.
Distribution is debian or ubuntu.

Attached is a source file that demonstrate this behavior.
./a.out port_number

Sample execution :

./a.out 35489
Out port : 35489
connect try 1 failed : Connection refused
connect try 2 failed : Connection refused
connect try 3 failed : Connection refused
.....
connect try 6089 failed : Connection refused
connect try 6090 failed : Connection refused
Connection success : 6091 try
Connection closed
last error : Connection refused


Is this behavior to be expected?
Can it be disabled?

Thanks in advance.

Regards,

Brice Videau

[-- Attachment #2: client.c --]
[-- Type: text/x-csrc, Size: 1536 bytes --]

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>

int main(int argc, char **argv) {
   unsigned short out_port = 35000;
   char * endptr;
   struct sockaddr_in server_address;
   int out_socket;
   int i=1;

   if( argc > 1 ) {
      out_port = (unsigned short) strtol(argv[1], &endptr, 10);
      errno = 0;
      if(errno != 0 || out_port == 0 || endptr == argv[1] ) {
         perror("Invalid port number");
         exit(1);
      }
   }
   printf( "Out port : %hu\n", out_port );
   fflush(NULL);

   memset( &server_address, 0, sizeof(struct sockaddr_in) );
   server_address.sin_family = AF_INET;
   server_address.sin_port = htons(out_port);
   if ( inet_pton( AF_INET, "127.0.0.1", &(server_address.sin_addr) ) <= 0 ) {
      perror("inet_pton error");
      exit(1);
   }

   if ( (out_socket = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
      perror("socket error");
      exit(1);
   }

   while (connect(out_socket, (struct sockaddr *) &server_address, sizeof(struct sockaddr_in)) < 0)
   {
      fprintf(stderr,"connect try %i failed : ",i);
      perror("");
      fflush(NULL);
      i++;
   }

   printf("Connection success : %i try\n",i);
   fflush(NULL);

   if( close(out_socket) < 0 ) {
      perror("close error");
      exit(1);
   }

   printf("Connection closed\n");
   fflush(NULL);

   fprintf(stderr,"last error : ");
   perror("");

   return 0;
}

             reply	other threads:[~2006-10-30 10:25 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-10-30 10:24 Videau Brice [this message]
2006-10-30 10:32 ` Strange connect behavior Eric Dumazet
2006-10-30 11:24   ` Videau Brice

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4545D2FA.3030802@imag.fr \
    --to=brice.videau@imag.fr \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox