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 <stdio.h>  #include <sys/types.h>  #include <sys/socket.h>  #include <sys/un.h>   #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 <stdio.h>  #include <sys/types.h>  #include <sys/socket.h>  #include <sys/un.h>  #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解析及实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

参与评论