?
Solved

Getting port number of socket after bind with sin_port=0

Posted on 2004-04-09
12
Medium Priority
?
2,809 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
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

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

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Preface I don't like visual development tools that are supposed to write a program for me. Even if it is Xcode and I can use Interface Builder. Yes, it is a perfect tool and has helped me a lot, mainly, in the beginning, when my programs were small…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use while-loops 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.

771 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