码迷,mamicode.com
首页 > 其他好文 > 详细

网络编程

时间:2016-08-12 18:23:08      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:

1.1网络编程的基本概念

不同的程序进行网络通信的时候,需要通过IP地址和套接字(socket)来访问一个主机。

1.1.1  IP地址

IP地址的作用是用来表示网络中的一台计算机(相当于计算机的身份证),每一台计算机都有一个IP地址,程序通过IP地址来访问计算机。

1.1.2 端口

端口,是计算机中为了标示计算机中访问网络的不同程序的标号(是程序的标号)每个程序在访问网络时都会获得一个标识符。

此端口不是网卡接线的端口,而只是一个虚拟的逻辑编号。

端口号是用于区分网络通信中主机上不同的网络应用程序。

1.1.3 域名

域名是用来代替IP地址以标识计算机的一种直观名称。

www.baidu.com

1.1.4 TCP和UDP

两种不同的网络传输方式,是用于不同程序间进行数据传输的协议或者约定。TCP和UDP的主要区别在于进行数据传输时是否需要进行连接。

1.1.4.1 TCP

一种面向连接的网络传输方式。

过程:计算机A和计算机B进行信息传输。A先呼叫B,待B接收连接后发出确认信息,A收到确认信息后发送信息。B接收完信息后发送完毕信息。再关闭数据连接。

TCP是可靠的,缺点是传输过程复杂,需要占用较多的资源。

1.1.4.2 UDP

一种面向无连接的传输方式。

过程:计算机A和计算机B进行信息传输。不建立连接,A直接把信息发送到网络上,由网络完成信息传输,信息传递完成也不发送确认信息。

UDP是不可靠的,但是传输效率很高。

1.2套接字(Socket)

套接字本意是插座,在网络中用来描述计算机中不同程序与其他计算机程序的通信方式。

1.2.1 套接字的定义

一种用于网络传输数据的编程接口,称为套接字。(网络编程者只要遵守套接字的编程规范,就可以编写出可以在网络中通信的应用程序)。

 

区分不同应用程序进程间的网络通信和连接,主要使用三个参数:通信的目的IP地址,传输协议(TCP或者UDP),端口号。【套接字=传输层协议+端口号+IP地址】

 

编程时主要是使用以上三个参数来构造一个套接字。套接字相当于一个接口,可以进行不同计算机程序的信息传递。

1.2.2 套接字相关的数据类型

Sockaddr

Struct sockaddr

{

Unsigned short int sa_family;

Char sa_data[14];

};

 

Sockaddr_in

Struct sockaddr_in

{

Unsigned short int sin_family;

Uint16_t sin_port;

Struct in_addr sin_addr;

Unsigned char sin_zero[8];

};

其中Struct in_addr用来保存一个IP地址。

Struct in_addr

{

Unit32_t s_addr;

};

 

1.2.3套接字类型

套接字类型指的是在网络通信中不同的数据传输方式。比如TCP和UDP。

常用的三个套接字类型:

流套接字(SOCK_STREAM):流套接字使用了面向连接的可靠的数据通信方式,即TCP协议。这种服务可以实现无差错,无重复发送,按顺序发送。

数据报套接字(Raw Sockets):面向无连接的数据传方式,即UDP协议。这种协议在数据发送出去以后就完成通信的任务。数据的传输全靠网络来实现。不可靠。

原始套接字(SOCK_RAW):流套接字和数据报套接字都是系统定义好的套接字,必须按照这种方式封装。原始套接字是没有经过处理的IP数据包,可以按照自己程序的要求来封装。

 

1.3域名和IP地址

在TCP/IP网络中,通信双方必须知道对方的IP地址来能进行正常通信,如果给出的是域名,而域名不能直接访问主机,必须先转换成对应的IP地址,这个过程就是域名解析。

1.3.1用域名取得主机的IP地址

相应函数:struct hostent *gethostbyname(const char *name)

1.3.2用IP地址返回域名

用IP地址查询到对应的域名,反向域名解析。

相应函数:struct hostent *gethostbyaddr(const void *addr,socklen_len,int type)

 

1.4网络协议

网络协议,即不同计算机或者操作系统在进行网络通信时的统一约定。在网络编程时就需要遵守这种协议。

1.4.1由协议名取得协议数据

在编程时,需要通过协议名(比如TCP\UDP都是协议名)来取得协议的数据。

返回值是个指针。

相应函数:struct protoent *getprotobyname(char *name);

1.4.2 由协议编号来取得协议信息

知道一个协议的编号proto,可以取得该协议的信息。返回值是个指针。

相应函数:struct protoent *getprotobynumber(int proto);

1.4.3 取得系统支持的所有协议

返回值是个指针。

相应函数:struct protoent *getprotoent(void);

1.5网络服务

网络服务就是网络上的计算机通过运行程序,为其他计算机提供信息或者运算的功能。

1.5.1取得系统支持的网络服务

相应函数:struct servent *getservent(void);返回的是一个指针。

1.5.2用名称取得系统支持的服务

可以用一个服务的名称来取得一个服务

相应函数:struct protoent *getservbyname(char *name,char *proto);

Name是一个服务的名称,proto 是该服务所使用的协议。返回一个指针。

1.5.3 由端口取得服务名称

函数getservbyport可以从一个端口取得一个服务的信息。

相应函数:struct protoent *getservbyport(int port,char *proto);

Port是端口号,需要有htons转换,即htons(端口号)

1.6网络地址的转换

IP地址原来是用32位二进制来表示,为了方便,常用点分十进制数来表示IP地址。

1.6.1 将网络地址转换成长整型

函数 inet_addr : long inet_addr(char *cp)

其中,函数的参数cp是一个IP地址字符串,函数可以将这个IP地址转换成一个长整型数。

例如 192.168.1.1 经过转换之后输出一个长整型数16885952

 

1.6.2 将长整型数地址装换成网络地址

函数inet_ntoa : char *inet_ntoa(struct in_addr in);

其中

Struct in_addr

{

Unit32_t s_addr;

};

其中s_addr是一个长整型数,用于存放一个长整型的IP地址,函数可将其转换成一个字符串输出。比如输入一个长整型数16885952,可输出一个字符串“192.168.1.1”

 

1.6.3主机字符顺序和网络字符顺序的转换

计算机中的长整型地址转换到网络字符顺序的整型地址,使用htonl函数。

 

1.7错误处理

1.7.1 herror函数显示错误

函数herror可以显示上一个网络函数发生的错误。

Void herror(const char *s):调用函数时先输出这个字符串s,然后输出上一个网络函数的错误信息。

1.7.2 捕获错误编号

捕获发生错误的编号:extern int h_errno;

捕获这个错误编号之后,用hstrerror函数来输出这个错误信息,

char *hstrerror(int err),参数是已经捕获的错误编号,返回与编号队应的错误信息字符串。

 

网络编程

标签:

原文地址:http://www.cnblogs.com/jinchengsong/p/5765664.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!