Return to BSD News archive
Path: euryale.cc.adfa.oz.au!newshost.carno.net.au!harbinger.cc.monash.edu.au!munnari.OZ.AU!news.Hawaii.Edu!news.uoregon.edu!news-peer.gsl.net!news.gsl.net!howland.erols.net!newsfeed.internetmci.com!uunet!in3.uu.net!newsflash.concordia.ca!sunqbc.risq.net!news1.sympatico.ca!news.bellglobal.com!rrwood From: Roy Wood <rrwood@mars.execulink.com> Newsgroups: comp.unix.bsd.freebsd.misc Subject: Re: How to open a socket under FreeBSD? Date: Mon, 28 Oct 96 09:53:24 -0500 Organization: Silicon Angst Software Lines: 60 Distribution: world Message-ID: <961028094417-rrwood@mars.execulink.com> References: <GORSKI.96Oct26172702@axiom.www.xxx> Reply-To: rrwood@mars.execulink.com NNTP-Posting-Host: ppp5.saturn.execulink.com X-To: gorski@cips01.physik.uni-bonn.de X-Newsreader: rnMac v2.0d9 In article <GORSKI.96Oct26172702@axiom.www.xxx>, 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. It's fine. Since sockets can be of many types (Internet, unix, file system, etc.), the 'struct sockaddr' is a general structure (check the header files if you're really curious about the details). In your case, since you're dealing with only an Internet socket, you use a 'struct sockaddr_in', which is defined with the correct structure elements for an Internet address. The trailing '_in' on the 'sockaddr_in' should help you remember that this is an Internet-related data structure. Anyway, use the 'sockaddr_in' structure and just typecast it when you bind the address to the socket. > * 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]; > * }; Yeah-- there's the sockaddr_in definition for you. > struct sockaddr_in name; > > /* 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); > } And this should work quite nicely as an example, though you'll probably want to typecast that pointer to 'name'. Try this: if (bind(sock,(struct sockaddr *) &name, sizeof(name))) { perror("binding datagram socket"); exit(1); } By the way, the programmer's supplementary documents for 4.4BSD have a couple of good tutorials about all of this. O'Reilly publishes the whole 4.4BSD documentation series in a nice format, though I'm sure you can download them somewhere too. -Roy -- http://www.mars.execulink.com/~rrwood