标签:
1.1网络编程的基本概念
不同的程序进行网络通信的时候,需要通过IP地址和套接字(socket)来访问一个主机。
1.1.1 IP地址
IP地址的作用是用来表示网络中的一台计算机(相当于计算机的身份证),每一台计算机都有一个IP地址,程序通过IP地址来访问计算机。
1.1.2 端口
端口,是计算机中为了标示计算机中访问网络的不同程序的标号(是程序的标号)每个程序在访问网络时都会获得一个标识符。
此端口不是网卡接线的端口,而只是一个虚拟的逻辑编号。
端口号是用于区分网络通信中主机上不同的网络应用程序。
1.1.3 域名
域名是用来代替IP地址以标识计算机的一种直观名称。
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