c语言之Linux网络开发

一、网络编程预备知识 socket IP地址 端口号 字节序 (一)socket 是一个编程接口 是一种特殊的文件描述符 (everything in Unix is a file) 并不仅限于TCP/IP协议 面向连接 (Transmission Control Protocol - TCP/IP) 无连接 (User Datagram Protocol -UDP 和 Inter-network Packet Exchange - IPX) (二)socket类型 1、流式套接字(SOCK_STREAM) 提供了一个面向连接、可靠的数据传输服务,数据无差错、无重复的发送且按发送顺序接收。内设置流量控制,避免数据流淹没慢的接收方。数据被看作是字节流,无长度限制。 2、数据报套接字(SOCK_DGRAM) 提供无连接服务。数据包以独立数据包的形式被发送,不提供无差错保证,数据可能丢失或重复,顺序发送,可能乱序接收。 3、原始套接字(SOCK_RAW) 可以对较低层次协议如IP、ICMP直接访问。 (三)socket的位置 (四)IP地址 IP地址是Internet中主机的标识: Internet中的主机要与别的机器通信必须具有一个IP地址 IP地址为32位(IPv4)或者128位(IPv6) 每个数据包都必须携带目的IP地址和源IP地址,路由器依靠此信息为数据包选择路由 表示形式:常用点分形式,如202.38.64.10,最后都会转换为一个32位的无符号整数 (五)端口号 为了区分一台主机接收到的数据包应该转交给哪个进程来进行处理,使用端口号来区别 TCP端口号与UDP端口号独立 端口号一般由IANA (Internet Assigned Numbers Authority) 管理 众所周知端口:1~1023(1~255之间为众所周知端口,256~1023端口通常由UNIX系统占用) 注册端口:1024~49150 动态或私有端口:49151~65535 (六)字节序 不同类型CPU的主机中,内存存储多字节整数序列有两种方法,称为主机字节序(HBO): 小端序(little-endian) - 低序字节存储在低地址 将低字节存储在起始地址,称为“Little-Endi...

c语言之队列及其实现

一、什么是顺序队列

队列是限制在两端进行插入操作和删除操作的线性表

允许进行存入操作的一端称为“队尾”

允许进行删除操作的一端称为“队头”

当线性表中没有元素时,称为“空队”

特点 :先进先出(FIFO)

队列

二、顺序队列设计

创建队列 :CreateQueue ()

清空队列 :ClearQueue (Q)

判断队列空 :EmptyQueue(Q)

判断队列满 :FullQueue(Q)

入队 :EnQueue (Q , x)

出队 :DeQueue(Q)

typedef  int  data_t ;    /*定义队列中数据元素的数据类型*/
#define  N  64	    /*定义队列的容量*/
typedef  struct {
      data_t  data[N] ;   /*用数组作为队列的储存空间*/
      int  front, rear ;     /*指示队头位置和队尾位置的指针*/
} sequeue_t ; 	     /*顺序队列类型定义*/

  • front指向队头元素的位置
  • rear指向队尾元素的下一个位置

在队列操作过程中,为了提高效率,以调整指针代替队列元素的移动,并将数组作为循环队列的操作空间。

为区别空队和满队,满队元素个数比数组元素个数少一个。

队列

三、什么是链式队列

插入操作在队尾进行,删除操作在队头进行,由队头指针和队尾指针控制队列的操作。

typedef  int  data_t;

typedef  struct  node_t
{   data_t data ;
   struct node_t   *next;
 } linknode_t,  *linklist_t;

typedef  struct
{  linklist_t  front,  rear;
} linkqueue_t;

队列

队列

  • 创建空队列
linkqueue_t  *CreateQueue()
{
      linkqueue_t  *lq  =  (linkqueue_t  *)malloc(sizeof(linkqueue_t));
      lq->front = lq->rear = (linklist_t)malloc(sizeof(linknode_t));
      lq->front->next = NULL ;	  /*置空队*/
          return  lq;     /*返回队列指针*/
}

  • 判断队列空
int   EmptyQueue(linkqueue_t  *lq)  {
   return ( lq->front  = =  lq->rear) ;
}

  • 入队
void  EnQueue (linkqueue_t *lq, data_t x)
{
      lq->rear->next = (linklist_t)malloc(sizeof(linknode_t)) ;
      lq->rear = lq->rear->next; 	     /*修改队尾指针*/
      lq->rear->data = x ;		     /*新数据存入新节点*/
	lq->rear->next = NULL ;	     /*新节点为队尾*/
           return;
}

  • 出队
data_t  DeQueue(linkqueue_t  *lq)
{
       data_t   x;
	linklist_t   p;	       /*定义一个指向队头结点的辅助指针*/
	p = lq->front->next ;    /*将它指向队头结点*/
	lq->front->next = p->next ;     /*删除原先队头结点
       x = p->data;
	 free(p) ; 	/*释放原队头结点*/
       if  (lq->front->next  ==  NULL)  lq->rear  =  lq->front;
       return  x;
}

此博客中的热门博文

玩转虚拟机系列之如何搭建虚拟机

玩转虚拟机系列之远程工具

玩转虚拟机系列之如何高效创建虚拟机