套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行。
套接字的特性有三个属性确定,它们是:域(域),类型(类型),和协议(协议),套接字还用地址作为它的名字。地址的格式随域(又被称为协议族,协议的家庭)的不同而不同,每个协议族又可以使用一个或多个地址族定义地址格式。
域指定套接字通信中使用的网络介质。最常见的套接字域是AF_INET,它是指互联网网络,许多Linux局域网使用的都是该网络,当然,因特网自身用的也是它。其底层的协议——网际协议(IP)只有一个地址族,它使用一种特定的方式来指定网络中的计算机,即IP地址。
在计算机系统内部,端口通过分配一个唯一的16位的整数来表示,在系统外部,则需要通过IP地址和端口号的组合来确定。
流套接字(在某些方面类似域标准的输入/输出流)提供的是一个有序,可靠,双向字节流的连接。
流套接字由类型SOCK_STREAM指定,它们是在AF_INET域中通过TCP/IP连接实现的。他们也是AF_UNIX域中常见的套接字类型。
<强>数据包套接字强>
与流套接字相反,由类型SOCK_DGRAM指定的数据包套接字不建立和维持一个连接。它对可以发送的数据包的长度有限制。数据报作为一个单独的网络消息被传输,它可能会丢失,复制或乱序到达。
数据报套接字实在AF_INET域中通过UDP/IP连接实现,它提供的是一种无需的不可靠服务。
只要底层的传输机制允许不止一个协议来提供要求的套接字类型,我们就可以为套接字选择一个特定的协议。
先上一个代码
服务端:
//s_unix.c # include & lt; stdio.h> # include & lt; sys/types.h> # include & lt; sys/socket.h> # include & lt; sys/un.h> #定义UNIX_DOMAIN“/tmp/UNIX.domain” int主要(空白) { socklen_t clt_addr_len; int listen_fd; int com_fd; int受潮湿腐烂; int我; 静态字符recv_buf [1024]; int len; struct sockaddr_un clt_addr; struct sockaddr_un srv_addr; listen_fd=插座(PF_UNIX SOCK_STREAM 0); 如果(listen_fd<0) { perror(“不能创建通信套接字”); 返回1; }//设置服务器addr_param srv_addr.sun_family=AF_UNIX; strncpy (srv_addr.sun_path UNIX_DOMAIN, sizeof (srv_addr.sun_path) 1); 分离(UNIX_DOMAIN);//绑定sockfd,addr ret=绑定(listen_fd (struct sockaddr *), srv_addr, sizeof (srv_addr)); 如果(ret==1) { perror(“不能绑定服务器套接字”); 关闭(listen_fd); 分离(UNIX_DOMAIN); 返回1; }//听sockfd ret=听(listen_fd, 1); 如果(ret==1) { perror(“不能听客户端连接请求”); 关闭(listen_fd); 分离(UNIX_DOMAIN); 返回1; }//连接请求使用接受 len=sizeof (clt_addr); com_fd=接受(listen_fd (struct sockaddr *), clt_addr,, len); 如果(com_fd<0) { perror(“不能接受客户端连接请求”); 关闭(listen_fd); 分离(UNIX_DOMAIN); 返回1; }//读取和printf发送客户端信息 printf ("/n==========信息/n”); (i=0; i<4,我+ +) { memset (recv_buf 0 1024); int num=阅读(com_fd recv_buf, sizeof (recv_buf)); printf("消息从客户端(% d)): % s/n”, num, recv_buf); } 关闭(com_fd); 关闭(listen_fd); 分离(UNIX_DOMAIN); 返回0; }
客户端:
//c_unix.c # include & lt; stdio.h> # include & lt; sys/types.h> # include & lt; sys/socket.h> # include & lt; sys/un.h> #定义UNIX_DOMAIN“/tmp/UNIX.domain” int主要(空白) { int connect_fd; int受潮湿腐烂; char snd_buf [1024]; int我; 静态结构sockaddr_un srv_addr;//创建unix socket connect_fd=插座(PF_UNIX SOCK_STREAM 0); 如果(connect_fd<0) { perror(“不能创建通信套接字”); 返回1; } srv_addr.sun_family=AF_UNIX; strcpy (srv_addr.sun_path UNIX_DOMAIN);//连接服务器 ret=连接(connect_fd (struct sockaddr *), srv_addr, sizeof (srv_addr)); 如果(ret==1) { perror(“不能连接到服务器”); 关闭(connect_fd); 返回1; } memset (snd_buf 0 1024); strcpy (snd_buf”,消息从客户端”);//向服务器发送信息 (i=0; iLinux进程间通信方式之插座使用实例