千家信息网

linux IPC之socket解析及实例代码

发表于:2024-10-24 作者:千家信息网编辑
千家信息网最后更新 2024年10月24日,Linux下的Socket通信是一种基于文件的IPC通信,也可以是基于其他设备的IPC通信。它可以在本机内不同进程间实现通信,也可以在实现不同主机之间的通信。socket的创建步骤服务端1.通过soc
千家信息网最后更新 2024年10月24日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解析及实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

0