首页服务器Linux服务器 Linux进程间通信方式之socket使用实例

Linux进程间通信方式之socket使用实例

套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行。
套接字的特性有三个属性确定,它们是:域(domain),类型(type),和协议(protoc…

套接字是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行。
套接字的特性有三个属性确定,它们是:域(domain),类型(type),和协议(protocol)。套接字还用地址作为它的名字。地址的格式随域(又被称为协议族,protocol family)的不同而不同。每个协议族又可以使用一个或多个地址族定义地址格式。

1.套接字的域

域指定套接字通信中使用的网络介质。最常见的套接字域是AF_INET,它是指Internet网络,许多Linux局域网使用的都是该网络,当然,因特网自身用的也是它。其底层的协议——网际协议(IP)只有一个地址族,它使用一种特定的方式来指定网络中的计算机,即IP地址。

在计算机系统内部,端口通过分配一个唯一的16位的整数来表示,在系统外部,则需要通过IP地址和端口号的组合来确定。

2.套接字类型

流套接字(在某些方面类似域标准的输入/输出流)提供的是一个有序,可靠,双向字节流的连接。

流套接字由类型SOCK_STREAM指定,它们是在AF_INET域中通过TCP/IP连接实现的。他们也是AF_UNIX域中常见的套接字类型。

数据包套接字

与流套接字相反,由类型SOCK_DGRAM指定的数据包套接字不建立和维持一个连接。它对可以发送的数据包的长度有限制。数据报作为一个单独的网络消息被传输,它可能会丢失,复制或乱序到达。

数据报套接字实在AF_INET域中通过UDP/IP连接实现,它提供的是一种无需的不可靠服务。

3.套接字协议

只要底层的传输机制允许不止一个协议来提供要求的套接字类型,我们就可以为套接字选择一个特定的协议。

先上一个代码

服务端:

//s_unix.c #include  #include  #include  #include   #define UNIX_DOMAIN "/tmp/UNIX.domain" int main(void) {   socklen_t clt_addr_len;   int listen_fd;   int com_fd;   int ret;   int i;   static char recv_buf[1024];    int len;   struct sockaddr_un clt_addr;   struct sockaddr_un srv_addr;   listen_fd=socket(PF_UNIX,SOCK_STREAM,0);   if(listen_fd<0)   {     perror("cannot create communication socket");     return 1;   }    //set server addr_param   srv_addr.sun_family=AF_UNIX;   strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);   unlink(UNIX_DOMAIN);   //bind sockfd & addr   ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));   if(ret==-1)   {     perror("cannot bind server socket");     close(listen_fd);     unlink(UNIX_DOMAIN);     return 1;   }   //listen sockfd    ret=listen(listen_fd,1);   if(ret==-1)   {     perror("cannot listen the client connect request");     close(listen_fd);     unlink(UNIX_DOMAIN);     return 1;   }   //have connect request use accept   len=sizeof(clt_addr);   com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);   if(com_fd<0)   {     perror("cannot accept client connect request");     close(listen_fd);     unlink(UNIX_DOMAIN);     return 1;   }   //read and printf sent client info   printf("/n=====info=====/n");   for(i=0;i<4;i++)   {     memset(recv_buf,0,1024);     int num=read(com_fd,recv_buf,sizeof(recv_buf));     printf("Message from client (%d)) :%s/n",num,recv_buf);    }   close(com_fd);   close(listen_fd);   unlink(UNIX_DOMAIN);   return 0; } 
本文来自网络,不代表1号站长-站长学院|资讯交流平台立场。转载请注明出处: https://www.1cn.cc/fwq/Linux/9263.html
上一篇Linux中hexdump命令用法
下一篇 Linux中利用grep命令如何检索文件内容详解
admin

作者: admin

这里可以再内容模板定义一些文字和说明,也可以调用对应作者的简介!或者做一些网站的描述之类的文字或者HTML!

为您推荐

评论列表()

    联系我们

    联系我们

    0898-88888888

    在线咨询: QQ交谈

    邮箱: email@wangzhan.com

    工作时间:周一至周五,9:00-17:30,节假日休息

    关注微信
    微信扫一扫关注我们

    微信扫一扫关注我们

    关注微博
    返回顶部