网络编程是Linux开发中的重要部分,Linux环境网络编程是基于Socket的C语言编程,Socket本意是插座,它在网络中描述不一样计算机之间通讯的方式。网络通讯中可使用TCP或者UDP协议,对于咱们来讲不会太关心协议自己的细节,而是更关注不一样主机之间传输的过程,所以制定了一种用于网络传输数据的编程接口,称为套接字(Socket)。编程
Socket编程接口内容不少,我本身看了一部分以后感受学习过程当中须要分析数据通讯的过程,理解网络中的基础知识才不至于混肴。下面是一些网络编程的基本操做。 网络
一、网络编程的基本概念socket
二、套接字tcp
区别不一样应用程序进程间通讯和链接,只要使用三个参数:通讯的目的IP,使用的传输层协议(TCP/IP)和端口号,编程时这三个参数构成一个套接字接口。 函数
C程序进行套接字编程时,使用sockaddr_in数据类型,这是系统定义的结构体,用于保存套接字信息,定义以下: 学习
struct socketaddr { usigned short int sin_family; uint16_t sin_port; struct in_addr sin_addr; unsigned char sin_zero[8]; }
AF_INET
。套接字的类型ui
三、域名与IP指针
域名取得相对应的IP地址
struct hostent *gethostbyname(const char *name);
name是保存域名的字符串,函数返回指向hostent结构体的指针,hostent结构体定义以下: code
struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; }
h_name
主机名称
h_aliases
主机别名
h_addrtype
主机名类型
h_length
地址长度
h_addr_list
主机IP 接口
IP取得相对应的域名
struct hostent *gethostbyaddr(const void *addr,socklen_t len,int type);
参数列表中addr是保存IP地址的字符串,len是IP地址长度,type通常为AF_INET
。
四、网络协议
网络协议是指不一样计算机之间进行通讯的约定,在进行网络编程时须要遵循这些协议。
struct protoent *getprotobyname(char *name);
name
是一个协议名称字符串,返回一个protoent结构体指针,protoent定义以下: struct protoent { char *p_name; char **p_aliases; int p_proto; }
p_name
:协议的名称
p_aliases
:协议的别名
p_proto
:协议的序号
struct protoent *pro=getprotobyname(“tcp”);
由协议编号取得协议数据
struct protoent *pro=getprotobynumber(“tcp”);
得到系统支持的全部协议
struct protoent *pro
while(pro=getprotoent()) { ... }
五、网络服务
所谓网络服务,指的是网络上的计算机经过运行程序,为其余计算机提供信息或运算的功能。
struct servent *getservent(void);
struct servent { char *s_name; char **s_aliases; int s_port; char *s_proto; }
s_name
:服务名
s_aliases
:服务别名
s_port
:服务端口号
s_proto
:服务使用的协议
服务名称获取服务
struct servent *getservbyname(char *name,char *proto);
端口取得服务名称
struct servent *getservbyport(int port,char *proto);
六、网络地址的转换
网络地址本是用32位二进制数来表示的,为了记忆方便,能够用点分十进制数来表示IP地址。同时,网络传输与计算机内部的字符存储方式是不一样的,须要相关函数将端口号进行转换。
inet_addr
能够将网络IP转为十进制长整型数。long inet_addr(char *cp);
#include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>
inet_ntoa
能够将整形地址转为网络地址,进而转换为点分十进制地址。char *inet_ntoa(struct in_addr in);
struct in_addr ip; ip.s_addr=16885952; printf("%s",inet_ntoa(ip));
uint32_t htonl(uint32_t hostlong) uint16_t htons(uint16_t hostshort) uint32_t ntohl(uint32_t netlong) uint16_t ntohs(uint16_t netshort)
七、错误处理
herror
能够显示上一个网络函数发生的错误,定义以下void herror(const char *s);
char s[]="error:"; herror(s);
extern int h_errno;
char *hstrerror(int err) //err是上面捕获的错误编号h_errno
以上是socket编程的基础知识!