初识网络编程

来源:互联网 发布:金域名人酒店婚宴 编辑:程序博客网 时间:2024/05/21 22:47

网络编程基础概念:

TCP/IP基本概念:

     TCP/IP协议(Transmission Control Protocol / Internet Protocol)叫做传输控制/网际协议,又叫网络通信协议。实际上,它包含了上百个功能的协议,如ICMP(互联网控制信息协议)、FTP(文件传输协议)、UDP(用户数据报协议)、ARP(地址解析协议)等。TCP负责发现传输的问题,一旦有问题就会发出重传的信号,直到所有数据安全正确地传输到目的地。而IP就是给因特网的每一台电脑规定一个地址。

IP地址:

     IP地址的作用是标识计算机的网卡地址,每一台计算机都有唯一个IP地址。在程序中是通过IP地址来访问一台计算机的。IP地址具有统一的格式,IP地址的长度是32位的二进制数值,4个字节。我们为了便于记忆,通常化为十进制的整数来表示,如:192.168.1.100。在Linux虚拟机终端输入命令:ifconfig,在DOC系统下输入:ipconfig可以查看到IP信息。

端口:

     所谓端口,是指计算机中为了表识同一计算机中不同程序访问网络而设置的编号。每个程序在访问网络时都会分配一个标识符,程序在访问网络或接受访问时,会用这个标识符表示这一网络数据属于这个程序。端口号其实是一个16位的无符号整数(unsigned short)也就是0~65535。不同编号范围的端口号有不同的作用。低于256的端口是系统保留端口号,主要用于系统进程通信。如WWW服务使用的是80号端口,FTP服务使用的是21号端口。不在这一范围内的端口号是自由端口号,在编程时可以调用这些端口号。

域名:

      域名是用来代替IP地址来标识计算机的一种直观名称。如百度网址IP是,119.75.213.50,没有任何逻辑含义,不便于记忆。我们一般选择www.baidu.com这个域名来代替IP地址。我们可以使用ping  baidu.com 来查看一个域名对应的IP地址。

_____________________________________________________________

套接字socket

      套接字(socket),在网络中用来描述计算机中不同程序与其他计算机程序的通信方式。人们常说的socket其实是一种特殊的IO接口,它也是一种文件描述符。

socket的定义:

       套接字(也叫套接口)由三个参数构成:IP地址、端口号、传输层协议,以区分不同应用程序进程间的网络通信与连接。

       socket也有一个类似于打开文件的函数调用,该函数返回一个整型的socket描述符,随后的建立连接、数据传输等操作都是通过socket来实现的。

socket类型:

常见的socket 有三种类型:

(1)、流式socket(SOCK_STREAM)

        流式套接字提供可靠的、面向连接的通信流;它使用TCP协议,从而保证了数据传输的正确性和顺序性。

(2)、数据报socket(SOCK_DGRAM)

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

(3)、原始socket

       原始套接字允许对底层协议如IP或ICMP进行直接访问,它功能强大但使用较为不便,主要用于一些协议的开发。

套接字数据结构:

      C程序进行套接字编程时,常会使用到sockaddr数据类型和sockaddr_in数据类型,用于保存套接字信息。

struct sockaddr

{

      unsigned short sa_family;  /*地址族,就是一些协议类型的集合*/

      char sa_data[14];  /*14字节的协议地址,包含该socket的IP地址和端口号*/

};

struct sockaddr_in

{

      short   int   sa_family;  /*地址族*/

      unsigned  short   int   sin_port;  /*端口号*/

      struct   in_addr  sin_addr;  /*IP地址*/

      unsigned  char  sin_zero[8];  /*全填0,保持与struct  sockaddr 同样大小*/

};

      上面这二个数据类型是等效的,可以相互转化,通常sockaddr_in数据类型使用更为方面。

sa_family常见值如下:

AF_INET:  IPv4协议

AF_INET6:IPv6协议

AF_LOCAL: UNIX域协议

 

主机名转化为IP地址(gethostbyname):

gethostbyname语法:

所需头文件:#include<netdb.h>

函数原型:strcut hostent *gethostbyname(const char *hostname)

函数传入值:hostname 即主机名

函数返回值:成功:hostent类型指针

                      失败:-1

struct hostent

{

      char  *h_name;      /*正式主机名*/

      char **h_aliases;   /*主机别名*/

      int   h_addrtype;   /*地址类型*/

      int h_length;        /*地址长度*/

      char  **h_addr_list;  /*指向IPv4或IPv6的地址指针数组*/

};

数据存储优先级顺序:

       计算机数据存储分高字节优先和低字节优先。即大端、小端的问题。而Internet上数据是以高位字节优先顺序在网络上传输的,但是ARM等一些CPU,除了摩托罗拉公司的CPU是大端的,常见的CPU都是小端格式存储数据的。所以我们有必要对这两个字节存储优先顺序进行互相转化一些。这里有:htos、ntohs、htonl、ntohl四个函数实现网络字节序和主机字节序的转化,这里的h代表host,n代表network,s代表short,l代表long。通常16位的IP端口号用s代表,而IP地址用 l 来代表

函数语法:

所需头文件: #include<netinet/in.h>

函数原型:uint16_t  htons(uint16_t   host16bit)

                  uint32_t  htonl(uint32_t   host32bit)

                  uint16_t  ntohs(uint16_t   net16bit)

                  uint32_t  ntohs(uint32_t   net32bit)

函数返回值:成功:返回要转换的字节序,失败:-1

 

这节就讲到这里,下节继续 ^_^

 

原创粉丝点击