*BSD News Article 81625


Return to BSD News archive

Newsgroups: comp.unix.bsd.freebsd.misc
Path: euryale.cc.adfa.oz.au!newshost.carno.net.au!harbinger.cc.monash.edu.au!munnari.OZ.AU!news.ecn.uoknor.edu!feed1.news.erols.com!howland.erols.net!news.sprintlink.net!news-peer.sprintlink.net!vixen.cso.uiuc.edu!uchinews!news
From: stephen farrell <spfarrel@meno.uchicago.edu>
Subject: Re: How to open a socket under FreeBSD?
X-Nntp-Posting-Host: meno.uchicago.edu
Message-ID: <87ramjiyuo.fsf@meno.uchicago.edu>
Lines: 73
Sender: news@midway.uchicago.edu (News Administrator)
Organization: University of Chicago -- Academic Computing Services
X-Newsreader: Gnus v5.2.25/XEmacs 19.14
References: <GORSKI.96Oct26172702@axiom.www.xxx>
Date: Mon, 28 Oct 1996 02:53:03 GMT

gorski@cips01.physik.uni-bonn.de writes:

> 
> 
> 
> I want to open a socket under FreeBSD, but all the examples I've found for BSD
> use the 'struct sockaddr_in'. FreeBSD needs 'struct sockaddr'! I'm not familiar
> with sockets. How can I open a socket under FreeBSD?
> I've seen something like  connect(sock, (struct sockaddr *) &name, sizeof(name))
> in some source codes. Is that the way? This seems to be wrong for me.
> 
> Thanks for help (links to resources,dox,books,etc. are welcome).
> 

you need to cast sockaddr into a sockaddr_in.  it just works -- as far
as i know it's magic.

> 
> 
> 
> None working example (from PSD:20):
> --------------------------------------------------------------------------------
> #include <sys/types.h>
> #include <sys/socket.h>
> #include <netinet/in.h>
> #include <stdio.h>
> 
> /*
>  * In the included file <netinet/in.h> a sockaddr_in is defined as follows:
>  * struct sockaddr_in {
>  *   short     sin_family;
>  *   u_short   sin_port;
>  *   struct in_addr sin_addr;
>  *   char sin_zero[8];
>  * };
>  *
>  * This program creates a datagram socket, binds a name to it, then reads
>  * from the socket.
>  */
> main()
> {
>      int sock, length;
>      struct sockaddr_in name;
>      char buf[1024];
> 
>      /* Create socket from which to read. */
>      sock = socket(AF_INET, SOCK_DGRAM, 0);
>      if (sock < 0) {
>           perror("opening datagram socket");
>           exit(1);
>      }
>      /* Create name with wildcards. */
>      name.sin_family = AF_INET;
>      name.sin_addr.s_addr = INADDR_ANY;
>      name.sin_port = 0;
>      if (bind(sock, &name, sizeof(name))) {
>           perror("binding datagram socket");
>           exit(1);
>      }
>      /* Find assigned port value and print it out. */
>      length = sizeof(name);
>      if (getsockname(sock, &name, &length)) {
>           perror("getting socket name");
>           exit(1);
>      }
>      printf("Socket has port #%d\n", ntohs(name.sin_port));
>      /* Read from the socket */
>      if (read(sock, buf, 1024) < 0)
>           perror("receiving datagram packet");
>      printf("-->%s\n", buf);
>      close(sock);
> }
> --------------------------------------------------------------------------------