UNIX域

1,什么叫UNIX域

TCP/IP协议可以用于不同计算机之间的通讯,使用对应的IP地址和端口来找到对方,其实就是一种进程间通讯,能在同一个电脑上的不同进程间进行通讯。

UNIX域是一个结合了套接字和管道通讯的一种进程间通讯的方式。它也有UDP/TCP的通讯的方式,这两种方式都是可靠的,都不会造成数据的丢失,或者数据发送顺序的混乱。

2.无名UNIX域

无名:有亲缘关系的进程间通讯。
有名:文件系统中,有一个文件或者节点,两个不同进程通过打开这个文件或者节点实现进程间通讯。

创建一个无名UNIX域:

        #include <sys/types.h>        
        #include <sys/socket.h>

         socketpair(int domain, int type ,int protocol,  int sv[2]);
        第一个参数:表示所需要使用的协议族,AF_UNIX, AF_LOCAL    建立UNIX的协议
       第二个参数:表示创建套接字的类型:SOCK_STREAM (流式的套接字)   SOCK_DGRAM(数据报的套接字)因为是使用在本机上的父子进程间通讯,所以都是可靠的。
        第三个参数:表示类型,这里都是用0。
   第四个参数:用来保存通讯所用到的socket的文件描述符。这种通讯是全双工,在使用之前先将一端关闭,使用另外一端来通讯。     

    返回值:成功返回0,失败返回-1

 

3、有名UNIX域

流式的套接字 (TCP)

客户端:
            1.创建套接字 socket
                int clientfd = socket( AF_UNIX, SOCK_STREAM, 0 );            
            2.初始化地址结构体
                通用地址结构体
                           struct sockaddr {
                                   sa_family_t sa_family;        //指定所用的协议族。
                                   char        sa_data[14];    //这里是具体的地址填充的空间。
                           }
                对于UNIX域来说,它也有自己的地址结构体,这个地址结构体在<linux/un.h>
                 #define UNIX_PATH_MAX   108

                    struct sockaddr_un {
                        __kernel_sa_family_t sun_family;      /* AF_UNIX */
                        char sun_path[UNIX_PATH_MAX];   /* pathname */ 有名UNIX域,这个节点在文件系统里
                                            (不能在共享目录下创建这个节点!!!!!)
                    };


            3.使用连接函数连接服务器  connect
                #include <sys/types.h>          /* See NOTES */
                #include <sys/socket.h>

                 int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
                第一个参数:就是第一步新建的socket返回的fd。
                第二个参数:指定你要链接的服务器的地址,就是第二步创建的地址。
                第三个参数:这个地址的长度。
                返回值: 如果成功返回0; 如果失败返回-1;

            4.连接服务器成功之后,就可以使用读写函数去通讯      
                 对数据收发:read/recv  write/send.

            5.关闭 close

        
服务器:
            1.创建套接字 socket
                int clientfd = socket( AF_UNIX, SOCK_STREAM, 0 );            
            2.初始化地址结构体
                通用地址结构体
                           struct sockaddr {
                                   sa_family_t sa_family;        //指定所用的协议族。
                                   char        sa_data[14];    //这里是具体的地址填充的空间。
                           }
                对于UNIX域来说,它也有自己的地址结构体,这个地址结构体在<linux/un.h>
                    #define UNIX_PATH_MAX   108

                    struct sockaddr_un {
                        __kernel_sa_family_t sun_family;        /* AF_UNIX */
                        char sun_path[UNIX_PATH_MAX];   /* pathname */ 有名UNIX域,这个节点在文件系统里
                                            (不能在共享目录下创建这个节点!!!!!)
                    };
            3.绑定 bind
                           #include <sys/types.h>          /* See NOTES */
                           #include <sys/socket.h>

                           int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
                    第一个参数:就是前面返回的文件描述符。
                    第二个参数:指定我们通讯的地址,这个是一个通用的结构体,它的地址,由指定的协议族去决定的。
                    第三个参数:指定的是第二个参数地址的大小。
            

            4.监听:listen 

                           #include <sys/types.h>          /* See NOTES */
                           #include <sys/socket.h>

                           int listen(int sockfd, int backlog);
                    第一个参数:前面新建的fd。
                    第二个参数:监听队列上最大的请求数。


           5.接受链接:accept。
                #include <sys/types.h>          /* See NOTES */
                #include <sys/socket.h>

                int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
                第一个参数:前面新建的fd。
                第二个参数:用来保存客户端的地址信息。
                第三个参数:用来保存客户端地址的长度。
            
            返回值:成功的话返回一个新的fd,然后服务器就可以通过这个新的fd和客户端进行通讯。如果失败返回 -1;

           6.对数据收发:read、recv  ,发送:write、send。
                ssize_t read(int fd, void *buf, size_t count);
                ssize_t write(int fd, const void *buf, size_t count);
                第一个参数:是前面accept函数返回的新的fd。代表我们要和对应的客户端进行通讯。
                第二个参数:是我们要发送或者接收的buffer对应的地址。
                第三个参数:对应是我们要读取或者写入的数据按字节计算的长度。

            返回值:成功的话,返回值的大小代表实际读取或者写入的字节数。这个返回值,和count不一定相等。如果出错的话,返回-1;

                       #include <sys/types.h>
                       #include <sys/socket.h>

                ssize_t send(int sockfd, const void *buf, size_t len, int flags);
                ssize_t recv(int sockfd, void *buf, size_t len, int flags);            
                第一个参数:是前面accept函数返回的新的fd。代表我们要和对应的客户端进行通讯。
                第二个参数:是我们要发送或者接收的buffer对应的地址。
                第三个参数:对应是我们要读取或者写入的数据按字节计算的长度。
                第四个参数:一般都是0;
            返回值:成功的话,返回值的大小代表实际读取或者写入的字节数。这个返回值,和count不一定相等。如果出错的话,返回-1;

            7.关闭:close

    
UNIX域 UDP通讯方式

服务器:
            
            (1)、创建socket
                int serverfd = socket( AF_UNIX, SOCK_DGRAM,0 );

            (2)、配置好自己的地址结构体。
                初始化地址结构体
                通用地址结构体
                           struct sockaddr {
                                   sa_family_t sa_family;        //指定所用的协议族。
                                   char        sa_data[14];    //这里是具体的地址填充的空间。
                           }
                对于UNIX域来说,它也有自己的地址结构体,这个地址结构体在<linux/un.h>
                    #define UNIX_PATH_MAX   108

                    struct sockaddr_un {
                        __kernel_sa_family_t sun_family; /* AF_UNIX */
                        char sun_path[UNIX_PATH_MAX];   /* pathname */ 有名UNIX域,这个节点在文件系统哪里
                                            (不能在共享目录下创建这个节点!!!!!)
                    };

            (3)、绑定自己的地址结构体。 bind

                           #include <sys/types.h>          /* See NOTES */
                           #include <sys/socket.h>

                           int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
                    第一个参数:就是前面返回的文件描述符。
                    第二个参数:指定我们通讯的地址,这个是一个通用的结构体,它的地址,由指定的协议族去决定的。
                    第三个参数:指定的是第二个参数地址的大小。
                返回值:
                    如果成功返回0;
                    如果失败返回-1;
            (4)、等待客户端发信息给服务器。(服务器是被动接收数据)
                    等待客户端发信息过来 recvfrom

                    #include <sys/types.h>
                    #include <sys/socket.h>

                    ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
                    第一个参数:是前面socket函数返回的fd。代表我们要和对应的客户端进行通讯。
                    第二个参数:是我们要发送或者接收的buffer对应的地址。
                    第三个参数:对应是我们要读取或者写入的数据按字节计算的长度。
                    第四个参数:一般都是0;
                    第五个参数:用来保存客户端的地址信息。
                    第六个参数:就是前面这个地址的长度。
                返回值:成功的话,返回值的大小代表实际读取的字节数。这个返回值,和count不一定相等。
                    如果出错的话,返回-1;

            (5)、可以进行数据的收发。
                sendto
                #include <sys/types.h>
                #include <sys/socket.h>

                ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
                第一个参数:是前面socket函数返回的fd。代表我们要和对应的客户端进行通讯。
                第二个参数:是我们要发送或者接收的buffer对应的地址。
                第三个参数:对应是我们要读取或者写入的数据按字节计算的长度。
                第四个参数:一般都是0;
                第五个参数:这个是我们要将数据发送到哪里?这个就是接收方的地址。这个参数一定要指定。
                第六个参数:就是前面这个地址的长度。
                返回值:成功的话,返回值的大小代表实际发送的字节数。这个返回值,和count不一定相等。如果出错的话,返回-1;

            (6)、通话结束,关闭连接。 close(fd);


 客户端:
            (1)、创建socket
            (2)、配置服务器的地址。
            (3)、还需要配置并且绑定自己的地址!!!!! 如果没有绑定自己地址的话,服务器就发不了数据给客户端
            (4)、往这个地址发数据。
            (5)、接收服务器发过来的数据。
            (6)、通讯结束,关闭连接
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值