日度归档:2015年7月20日

socket网络


socket网络

socket网络是基于tcp/ip协议族而运行的一种网络。


理想网络:类似于我们日常生活中的电话,端到端的进行连接,而且是同步,并且通话的中途不会被监听。
实际网络:实际网路并不是这种端到端的定向传送,而是一种广播式的传送,
例:我们现在需要传送一份数据,我们可以先将数据写在纸上,并且在数据上标示数据所到达的地址,把这张纸投递至邮筒中(网络中),然后邮递员会将邮筒中的信件全部收至邮件中转中心(路由器),
然后邮件在中转中心根据分类,转向下一个位置,直至到达目的地。
以上所描述的就是我们现阶段网络的工作方式。
实际网络理想化:由于现实中可能有数以亿计的信件从中转中心通过中转,所以此时我们可以把网络的连接设计的更加合理:
例: 1 协议保证数据传送的顺序性:避免接收到的数据杂乱无章,无法阅读
2 将大数据分片传送,分包传送
3 将网络地址进行合理的定义(网络地址的分派)


套接字的基本操作:
在linux中,对套接字的操作就是对一个文件的操作,首先可以通过socket创建一个套接字文件,返回一个文件描述符,当套接字被正确的初始化后,就可以对套接字进行读取(read) ,写入(write),同操作其它文件的方式类似,
当进程使用完套接字后,应该调用close关闭它,并释放资源。

建立一个套接字

#include < sys/socket.h>
int socket(int domain,int type,int protocol);

参数说明:
domain参数描述了使用的协议族,通常为以下内容:

地址

协议

协议描述
AF_UNIX

PF_UNIX

unix域
AF_INET

PF_INET

TCP/ip4
AF_INET6

PF_INET6

TCP/IP6
AF_AX25

pf_AX25

业余无线电使用
AF_IPX

PF_IPX

NOvell IPX
AF_APPLETALK

PF_APPLETALK

Apple talk dds
AF_NETCOM

PF_NETCOM

type参数说明:type参数需为以下参数任意一个:
1 SOCK_STREAM
从特定的协议族中指定一个提供流连接协议
2 SOCK_DGRAM
从特定的协议族中指定一个提供数据包协议
3 SOCK_RAM
提供直接向网络设备驱动程序发送包的能力
protocol参数说明:
通常此处为0,让内核根据前两个参数自动选择所需选择的协议,当我们使用PF_INET后,我们可以列举一些允许使用的协议,如下表所示:

协议

描述
IPPROTO_ICMP

IPV4中的消息控制协议
IPPROTO_ICMPV6

IPV6中的消息控制协议
IPPROTO_IPIP

IPIP通道协议
IPPROTO_IPV6

IPV6头
IPPROTO_RAW

原始IP包
IPPROTO_ICP

传输控制协议(TCP)
IPPROTO_UDP

用户报文协议


建立连接

当我们建立一个流套接字后,在使用套接字之前,我们需要让套接字连接上某个目标,这样套接字才可以工作。

服务器端套接字:当套接字建立完毕后,会持续的运行,等待其他进程的连接。


客户端套接字:当套接字建立后,进程会告诉套接字一个需要连接的地址,试着去同服务器建立连接请求,一旦建立连接,那么两个套接字之间就建立连接成功。



绑定套接字

服务器和客户端进程都必须告诉系统套接字所使用的地址。将一个地址和本地套接字相连接的过程称之为绑定。

等待连接

在创建套接字之后,服务器进程将套接字bind到它所监听的地址上,进程通过调用listen(),告诉系统它愿意让其他进程与该套接字建立连接。
一旦套接字被绑定到一个地址后,内核就能处理进程对这个地址的连接。连接的建立还需要通过accept系统调用来接收请求,新的试图连接,并且已经被监听到的连接,会一直处于等待accept为止。
通常accept处于阻塞状态,直到有一个客户端进程试图连接,可以通过fcntl函数将accept标记为非阻塞模式。
#include < sys/socket.h>

int listen(int sock,int backlog);
int accept(int sock,struct sockaddr *addr,socklen_t *addelen);

参数说明:sock套接字文件描述符 backlog 最大等待连接数 大于最大连接数的连接都会被拒绝


连接到一个服务器

客户端连接到服务器通常采用connect函数进行连接。
#include < sys/socket.h>
int connect(int sock,struct sockaddr * servaddr,socklen_t addrlen);

函数返回值
同open一样,当函数返回一个大于0的数,代表创建socket文件描述符成功,否则失败

相关阅读:
linux文件简介
linux文件打开文件的方法

作业控制

作业控制
作业控制是POSIX标准化的特征之一,同时被众多标准支持。
它允许多个作业在一个终端上运行,每个作业是一个或一组由管道所连接的进程。作业控制机制提供了作业在前台和后台之间切换的方法,可以放置后台终端对作业的访问。
每个执行一组进程的活动终端为一个会话,每个会话由进程组组成,每个进程组包含有一个或多个相互独立的进程。
会话中有一个进程组是前台进程组,其余的进程组都是后台进程组。


进程的状态:
每个进程都有三种状态:运行状态 停止状态 死锁状态。
当一个进程处于运行状态,我们可以通过在进程中调用exit 或进程接收到一个系统信号而使进程终止运行(进程在各种状态之间切换是由于收到其他进程 系统内核 自身产生的信号而导致进程的状态发生变化)。
例:当一个进程接收到SIGCONT信号时,内核将进程由停止状态转变为运行状态;如果进程已经处于运行状态,那么当前进程的状态就不发生变化。


停止进程:
有四种信号可以将处于运行状态的进程转换成停止状态。
1 SIGSTOP:此信号不是由内核产生,它提供了一种用户可以停止任意进程的手段,此信号不能被忽略和捕获.
2 SIGTSTP: 当用户按终端挂起键时,这个信号就会把前台进程组中的每一个进程发送给终端。
3 SIGTTIN:当一个后台进程试图从终端读取数据时就会收到SIGTTIN信号。
4 SIGTTOU:当一个后台进程想向其终端写入数据时,就会产生这个信号,只有在终端的TOSTOP属性已经设置以后,这个信号才会产生。


处理作业控制信号
虽然进程的终止和启动可以通过信号很容易的就完成相关操作,但是有些进程是需要做特殊处理
例:
1 在进程重新启动时,需保留以前的状态。
2 进程被挂起之前需要完成某些任务,这就必须为信号提供一个信号处理函数


作业控制主要讲述进程中对信号的处理。

相关阅读:
linux c 信号简介

因特网域名

因特网客户端和服务器互相通信时使用的ip地址,然而对于因特网用户来说,记住这么多数字是非常有难度的,所以因特网产生了一种更人性化,易记的域名,当我们访问域名时,系统根据域名转换为相应的ip地址。域名的产生对因特网的快速发展起着至关重要的作用。
下面我们就介绍因特网的域名相关函数:
相关头文件:
#include < netdb.h>
struct hostent *gethostbyname(const char *name);
struct hostent *gethostbyaddr(const char *addr,int len,0);
参数说明:
name:域名
addr:ip地址 len :ip地址的字节长度
返回值:
如果失败,则返回一个NULL指针
如果成功,则返回一个DNS结构体

struct hostent{
char *h_name;
char **h_aliases;
int h_addrtype;
int h_length;
int ** h_addr_list;
}


例 :
实验环境:mac OS


#include < stdio.h>
#include < netdb.h>
#include < arpa/inet.h>
int main(i nt argc,char **argv)
{
printf(“this is dns programes!\n”);
char **pp;
struct in_addr addr;
struct hostent *hostp;

if(argc !=2)
{
printf(“参数错误!\n”);
return 0;
}

if(inet_aton(argv[1],&addr) !=0)
hostp = gethostbyaddr((const char *)&addr,sizeof(addr),AF_INET);
else
hostp = gethostbyname(argv[1]);

printf(“official hostname:%s\n”,hostp->h_name);

for(pp = hostp->h_aliases;*pp !=NULL;pp++)
printf(“alias:%s\n”,*pp);

for(pp=hostp->h_addr_list;*pp !=NULL;pp++){
addr.s_addr =*((unsigned int *)*pp);
printf(“address:%s\n”,inet_ntoa(addr));
}

return 1;
}


运行效果图:
shenyetekiAir:c shenye$ ./dns localhost
this is dns programes!
official hostname:localhost
address:127.0.0.1

shenyetekiAir:c shenye$ ./dns maomao365.com
this is dns programes!
official hostname:maomao365.com
address:61.54.47.69

shenyetekiAir:c shenye$ ./dns
this is dns programes!
参数错误!
shenyetekiAir:c shenye$ ./dns cs.mit.edu
this is dns programes!
official hostname:eecs.mit.edu
alias:cs.mit.edu
address:18.62.1.6
shenyetekiAir:c shenye$ ./dns alo.com
this is dns programes!
official hostname:alo.com
address:211.106.65.111
address:211.106.65.112