[2 days left] What’s wrong with your cloud strategy? Learn why multicloud solutions matter with Nimble Storage.Register Now

x
?
Solved

Getting port number of socket after bind with sin_port=0

Posted on 2004-04-09
12
Medium Priority
?
2,844 Views
Last Modified: 2012-05-04
How do I retrieve the random port number after I do a bind on a socket?

    me.sin_family = AF_INET;
    me.sin_addr.s_addr = htonl(INADDR_ANY);
    me.sin_port = htons(0);
    rc = bind(sd, (struct sockaddr *) &me, sizeof(me))

    printf("Sending on port %d\n", random_port);

In other words, how do I get random_port?
0
Comment
Question by:iemonslice
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 7
  • 5
12 Comments
 
LVL 46

Accepted Solution

by:
Kent Olsen earned 400 total points
ID: 10793551
Hi iemonslice,

Call getsockname().

getsockname() will store the assigned address and port into the sockaddr structure."


Good Luck,
Kent
0
 

Author Comment

by:iemonslice
ID: 10793668
When I do a getsockname(), I get the following error:

getsockname: Bad address

What does the above mean?

Below is the code segment if you need to see it:
===============================================
    if (getsockname(sd, (struct sockaddr *) &me, (int *)sizeof(me)) == -1){
        perror("getsockname");
      exit(1);
    }
    printf("Listening on port %d\n", me.sin_port);
===============================================
0
 
LVL 46

Expert Comment

by:Kent Olsen
ID: 10793732
Hi iemonslice,

Based on your first call, you need to pass 'rc', not 'sd'.

    if (getsockname(rc, (struct sockaddr *) &me, (int *)sizeof(me)) == -1){
        perror("getsockname");
     exit(1);
    }
    printf("Listening on port %d\n", me.sin_port);


Kent
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 

Author Comment

by:iemonslice
ID: 10793765
I thought rc was the correct value to pass in, but when I tried it earlier, it gave me an error:

getsockname: Socket operation on non-socket

0
 
LVL 46

Expert Comment

by:Kent Olsen
ID: 10793791
Hi iemonslice,

Hmm.....   My mistake.  Your code should take this sequence:

  SocketId = socket ();
  bind (SocketId, ...);
  getsockname (SocketId, ...);


0
 

Author Comment

by:iemonslice
ID: 10793933
That's the way I have it right now. I'll paste the section in it's entirety below so it's easier than having to look above.

With the below I still have the getsockname: Bad address error.
 
===============================================
    if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1){
        perror("socket");
      exit(1);
    }

    me.sin_family = AF_INET;
    me.sin_addr.s_addr = htonl(INADDR_ANY);
    me.sin_port = htons(0);
    if ((bind(sd, (struct sockaddr *) &me, sizeof(me))) == -1){
        perror("bind");
        exit(1);
    }

    if (getsockname(sd, (struct sockaddr *) &me, (int *)sizeof(me)) == -1){
        perror("getsockname");
      exit(1);
    }
===============================================
0
 
LVL 46

Expert Comment

by:Kent Olsen
ID: 10793977
Hi iemonslice,

Print the address that is in 'me'.



0
 

Author Comment

by:iemonslice
ID: 10794102
Do you mean me.sin_addr.s_addr? If so, printing it out right after the bind outputs 0.
0
 

Author Comment

by:iemonslice
ID: 10797421
Anyone have any ideas about this problem of mine?
0
 

Author Comment

by:iemonslice
ID: 10797764
Ah the problem was the last parameter of getsockname().

Instead of sizeof(me), a pointer to the size worked.

socklen_t slen = sizeof(me);
getsock..(x,x,&slent);
0
 
LVL 46

Expert Comment

by:Kent Olsen
ID: 10798131
Cool.

Where does this stand now?
Kent
0
 

Author Comment

by:iemonslice
ID: 10798223
I actually knew about getsockname() before posting on experts-exchange, but going back to my first post, I never mentioned getsockname() and my problem. You did tell me the correct answer so you get the points. :)
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
The goal of this video is to provide viewers with basic examples to understand and use pointers in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use switch statements in the C programming language.

649 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question