栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > 服务器

linux IPC之socket解析及实例代码

服务器 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux IPC之socket解析及实例代码

Linux下的Socket通信是一种基于文件的IPC通信,也可以是基于其他设备的IPC通信。它可以在本机内不同进程间实现通信,也可以在实现不同主机之间的通信。

socket的创建步骤

服务端

1.通过socket()函数创建socket
2.通过bind函数绑定socket于设备地址
3.通过listen监听指定的socket
4.通过accept等待客户端的连接

客户端

1.通过socket()函数创建socket
2.通过connect连接到服务端

待经过上面的步骤后,服务端和客户端已经建立了链接,可以通过write/read或者sendto/recvfrom发送/接收数据.

示列

1.服务端

//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;
}

2.客户端

//c_unix.c
#include 
#include 
#include 
#include 
#define UNIX_DOMAIN "/tmp/UNIX.domain"
int main(void)
{
  int connect_fd;
  int ret;
  char snd_buf[1024];
  int i;
  static struct sockaddr_un srv_addr;
//creat unix socket
  connect_fd=socket(PF_UNIX,SOCK_STREAM,0);
  if(connect_fd<0)
  {
    perror("cannot create communication socket");
    return 1;
  }  
  srv_addr.sun_family=AF_UNIX;
  strcpy(srv_addr.sun_path,UNIX_DOMAIN);
//connect server
  ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
  if(ret==-1)
  {
    perror("cannot connect to the server");
    close(connect_fd);
    return 1;
  }
  memset(snd_buf,0,1024);
  strcpy(snd_buf,"message from client");
//send info server
  for(i=0;i<4;i++)
    write(connect_fd,snd_buf,sizeof(snd_buf));
  close(connect_fd);
  return 0;
}

总结

以上就是本文关于linux IPC之socket解析及实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/180299.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号