I'm trying to teach myself C network programming in general as well and
to do so I wrote a irc-like server and client. It illustrates sockets,
select() and a little ncurses. If anyone is interested I can forward
the code (about 200 lines total for both server and client)
Glynn Clements wrote:
>
> Anders Henriksson wrote:
>
> > I am trying to learn socket programing on linux. I think I am getting the hang
> > of most things but there is one utterly disturbing detail, I can't figure out
> > how to manipulate the sockaddr structure used in the connect library call
> > among others.
> >
> > In most code I have looked at another structure is used (sockaddr_in) but I
> > cant find the definition of this or the format of the sockaddr structure.
> >
> > What I really would like is to find the definition of sockaddr_in.
>
> `struct sockaddr_in' is defined in netinet/in.h, and is basically:
>
> struct sockaddr_in
> {
> unsigned short int sin_family; /* Address family */
> unsigned short int sin_port; /* Port number */
> struct in_addr sin_addr; /* Internet address */
> unsigned char sin_zero[8]; /* Pad to 16 bytes */
> };
>
> A `struct sockaddr' is basically an abstract type, which doesn't
> specify the format of the address:
>
> struct sockaddr
> {
> unsigned short int sa_family; /* Address family */
> char sa_data[14]; /* Address data */
> };
>
> To specify an address and port, fill in a `struct sockaddr_in', then
> cast its address to a `struct sockaddr *', e.g.
>
> #include <sys/socket.h>
> #include <netinet/in.h>
> #include <arpa/inet.h>
> #include <stdlib.h>
> #include <stdio.h>
>
> int main(int argc, char **argv)
> {
> struct sockaddr_in r_addr;
> int s;
>
> if (argc != 3)
> {
> fprintf(stderr, "Usage: %s <IP address> <port>\n", argv[0]);
> return 1;
> }
>
> s = socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
> if (s < 0)
> {
> perror("socket");
> return 1;
> }
>
> r_addr.sin_family = AF_INET;
> r_addr.sin_port = htons(atoi(argv[2]));
> r_addr.sin_addr.s_addr = inet_addr(argv[1]);
>
> if (connect(s, (struct sockaddr *) &r_addr, sizeof(r_addr)) == -1)
> {
> perror("connect");
> return 1;
> }
>
> /* at this point, `skt' is a socket which is connected to
> the specified IP address and port */
>
> return 0;
> }
>
> --
> Glynn Clements <[EMAIL PROTECTED]>