socket 学习

socket(int domain, int type, int protocol);

domain 协议族    AF_INET
type     协议类型 SOCK_STREAM, SOCK_DGRAM, SOCK_RAM,SOCK_PACKET(废弃obsolete) ...
protocol 协议号  

struct socket {
  short            type;        /* SOCK_STREAM, ...        */
  socket_state        state;

  long            flags;
  struct proto_ops    *ops;        /* protocols do most everything    */
  void            *data;        /* protocol data        */
  struct socket        *conn;        /* server socket connected to    */
  struct socket        *iconn;        /* incomplete client conn.s    */
  struct socket        *next;
  struct wait_queue    **wait;        /* ptr to place to wait on    */
  struct inode        *inode;

};

struct proto_ops {
    int faimly; //    协议族
    int (*read)(struct socket *, ...); // 各种具体方法
    ....

一般地,每个协议族会定义一个静态结构体 static struct proto_ops;
比如AF_INET 协议族的静态街头题如下:

inet_proto_ops = {
  AF_INET,

  inet_create,
  inet_dup,
  inet_release,
  inet_bind,
  inet_connect,
  inet_socketpair,
  inet_accept,
  inet_getname,
  inet_read,
  inet_write,
  inet_select,
  inet_ioctl,
  inet_listen,
  inet_send,
  inet_recv,
  inet_sendto,
  inet_recvfrom,
  inet_shutdown,
  inet_setsockopt,
  inet_getsockopt,
  inet_fcntl,
};

read方法为:static int inet_read(struct socket *sock, char *ubuf, int size, int noblock);
bind方法为:static int  inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);

struct sockaddr 是一个通用地址结构,这是为了统一地址结构的表示方法,统一接口函数,使不同的地址结构可以被bind() ,connect() 等函数调用;struct sockaddr_in中的in 表示internet,就是网络地址,这只是我们比较常用的地址结构,属于AF_INET地址族,他非常的常用,以至于我们都开始讨论它与 struct sockaddr通用地址结构的区别

sockaddr_in和sockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向
sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,
在最后用进行类型转换就可以了bzero((char*)&mysock,sizeof(mysock));//初始化

struct sockaddr {
unsigned short sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
sa_family是地址家族,一般都是“AF_xxx”的形式。好像通常大多用的是都是AF_INET。
sa_data是14字节协议地址。
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。
但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构
sockaddr_in(在netinet/in.h中定义):
struct sockaddr_in {
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]; /* Same size as struct sockaddr */
};


你可能感兴趣的:(socket 学习)