一生有你llx 阅读(147) 评论(0)

linux网络编程通过套接字(socket)实现,socket是一种文件描述符

socket三种类型:流式套接字SOCK_STREAM,提供可靠的、面向连接的通讯流,使用TCP协议,保证通信可靠性和顺序性

                            数据报套接字SOCK_DGRAM,定义一种无连接服务,数据通过独立报文传输,无序,不保证可靠, 使用UDP

                            原始套接字SOCK_RAW使用IP协议,用于新型的网络测试

网络地址:struct  sockaddr{

                            u_short  sa_family; 协议族

                            char  sa_data[14];  协议地址 

                                    }

                  struct  sockaddr_in{

                             short  int  sin_family;                          协议族

                             unsigned  short int  sin_port;             端口号

                             struct  int_addr   sin_addr;                 协议地址

                             unsigned  char  sin_zero[8];               填0                 

                                  }

                  typedef  struct in_addr{

                                union{

                                         struct{

                                                  unsigned  char  s_b1;

                                                  s_b2;

                                                  s_b3;

                                                  s_b4;

                                                  }S_un_b;

                                        struct{

                                                  unsigned  short  s_w1;

                                                  s_w2;

                                                 }S_un_w;

                                        unsigned  long  S_addr;

                                         }S_un;

                                  }IN_ADDR;

地址转换:IP通常是192.168.1.1形式,而struct  in_addr的IP 地址由32位整数表示

                  int  inet_aton(const char  *cp,struct  in_addr  *inp)  将a.b.c.d形式转换为32位形式,存储在inp

                  char *inrt_ntoa(struct  in_addr in)  将32位地址转换为啊,a.b.c.d

字节顺序转换:不同类型的cpu对变量的字节存储方式不一样,有的高位前低位后,有的低位前高位后。而网络字节顺序统一为高位前

                        htons   把unsigned  short类型从主机序转换为网络序

                        htonl    把unsigned  long类型从主机序转换为网络序

                        ntohs   把unsigned  short类型从网络序转为主机序

                        ntohl   把unsigned  longt类型从网络序转为主机序

网络上标识一台主机可以用IP地址,或者主机名

              struct  hostent  *gethostbyname(const char *hostname){

                        char *h_name;                  主机正式名       

                        char *h_aliases;             主机别名

                        int  h_addrtype;              主机地址类型

                        int  h_length;                  地址长度

                        char **h_addr_list ;         IP地址列表

                                    };

             #define  h_addr  h_addr_list[0]


UDP网络程序设计

UDP服务器:创建一个socket,用函数socket()

                     绑定IP地址、端口号等信息到socket,用函数bind()

                     循环接收数据,用函数recvfrom()

                     关闭网络链接

UDP客户端:创建一个socket,用函数socket()

                     绑定IP地址、端口号等信息到socket,用函数bind()

                     设置对方IP地址和端口号等信息

                     发送数据,sendto()

                     关闭网络链接


TCP网络程序设计

TCP服务器:创建一个socket,用函数socket()

                     绑定IP地址、端口号等信息到socket,用函数bind()

                     设置允许的最大链接数,listen()

                     等待来自客户端的链接请求,accept()

                     收发数据,用函数send和recv(),或者read()和write()

                     关闭网络链接

TCP客户端:创建一个socket,用函数socket()

                     设置要链接服务器的IP地址和端口号等信息

                     链接服务器,connect()

                     收发数据,用函数send和recv(),或者read()和write()

                     关闭网络链接