linux IPC之socket解析及实例代码

吾爱主题 阅读:138 2024-04-05 13:52:51 评论:0

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.服务端

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 //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.客户端

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 //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解析及实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

原文链接:http://blog.csdn.net/u010657219/article/details/44059073

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容