13、linux网络编程基础

 

       Socket

 

                     Linux中的网络编程通过socket()实现,socket是一种文件描述符

                     Socket有三种类型:

Ø         流式套接字(SOCK_STREAM)

    流式套接字可以提供可靠的,面向连接的通讯流,他使用TCP协议。TCP保证了数据传输的正确性和顺序性

Ø         数据报套接字(SOCK_DGRAM)

                            定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的,                         并且不保证可靠,无差错,他使用数据报协议UDP.

Ø         原始套接字(SOCK_RAW)

       原始套接字允许使用IP协议,主要用于新的网络协议的测试等。

 

                    网络地址

       1)在socket程序设计中,struct sockaddr 用于记录网络地址:

       Struct  sockaddr

              {

                     u_short sa_family;

                     char sa_data[14];

              }

ü         Sa_family 协议族,采用“AF_xx”的形式,如:AF_INET(ip协议族)。

ü         Sa_data: 14字节的特定协议地址

 

                            2)在socket程序设计中,struct sockaddr_in同样用于记录网络地址

                                   Struct dockaddr_in

                                          {

                                                 Short int sin_family; //协议族

                                                 Unsigned short int sin_port; //端口号

                                                 struct in_addr sin_addr ;  //协议特定地址

                                                 unsigned char sin_zero [8]; //填0

                                          }

                                   在编程中一般使用与sockaddr等价的sockaddr_in数据结构

 

                                                 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.0.1)的形式。而在struct in_addr中使用的IP地址是由32位的整数表示的,为了转换我们可以使用下面两个函数:

Ø        int inet_aton (const char *cp,struct in_addr *inp)

Ø        char *inet_ntoa (struct in_addr in)

                     函数里a代表ascii,n代表network

                     Inet_aton是将a,b,c,d形式的IP转换为32位的IP,存储在inp指针里,inet_ntoa是将32位IP转换为a,b,c,d的格式。

 

                                                        字节序转换

                     如:intel的CPU使用的小段字节序,motorola 68系列的CPU使用的是大端字节序。

                     Motorola发送一个16位的数据0X1234给intel,传到INTEL时,就被intel解释为0X3412

Ø        htons 把unsigned short 类型从主机序列转换到网络序(发送使用)

Ø        htonl 把unsigned long 类型从主机序转换到网络序(发送使用)

Ø        ntohs 把unsigned short 类型从网络序列转换到主机序(接受)

Ø        ntohi 把unsined long 类型从网络序转换到主机序

 

                                                       socket编程函数

Ø        socket   创建一个socket

Ø        bind    用于绑定ip地址和端口号到socket

Ø        connect 该函数用于与服务器建立连接

Ø        listen   设置服务器能处理的最大连接要求

Ø        accept  用来等待来自客户端的socket连接请求

Ø        send    发送数据

Ø        recv

你可能感兴趣的:(13、linux网络编程基础)