C语言 AF_UNIX tcp/udp socket实例

https://blog.csdn.net/shanzhizi/article/details/16882087

========================tcp 方式============================

服务器端:

    //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);  
/*unlink()  deletes  a  name  from  the  filesystem.  If that name was the last link to a file and no processes

unlink()  deletes  a  name  from  the  filesystem.  If that name was the last link to a file and no processes

have the file open the file is deleted and the space it was using is made available for reuse.    

If the name was the last link to a file but any processes still have the file open the file will remain in existence 

until  the  last  file descriptor referring to it is closed.    If the name referred to a symbolic link the link is removed. 

   If the name referred to a socket, fifo or device the name for it is removed but processes which have the object

open may continue to use it.    

首先你要明确一个概念,一个文件是否存在取决于它的inode是否存在,你在目录里看到的是目录项里一条指向该inode的链接,

而不是文件的本身.当你调用unlink的时候他直接把目录项里的该条链接删除了,但是inode并没有动,该文件还是存在的,

这时候你会发现,目录里找不到该文件,但是已经打开这个文件的进程可以正常读写.只有当打开这个inode的所有文件描述符

被关闭,指向该inode的链接数为0的情况下,这个文件的inode才会被真正的删除.

    从unlink的名字上就应该能判断出来,unlink含义为取消链接,remove才是删除的意思

*/
        //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   listen函数不会阻塞,立即返回
        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;  
    }  

客户端:

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

=======================================================================

udp方式

server端:

    #include <stdio.h>  
    #include <string.h>  
    #include <stdlib.h>  
    #include <unistd.h>  
    #include <sys/socket.h>  
    #include <sys/un.h>  
      
    #define PATH "./tt"  
      
    int main(int argc ,char *argv[])  
    {  
        int sockfd = 0;  
        struct sockaddr_un addr;  
        unlink(PATH);    
        addr.sun_family = AF_UNIX;  
        strcpy(addr.sun_path,PATH);  
      
        unsigned int len = strlen(addr.sun_path) + sizeof(addr.sun_family);  
        sockfd = socket(AF_UNIX,SOCK_DGRAM,0);  
        if(sockfd < 0 )  
        {  
            perror("socket error");  
            exit(-1);  
        }  
      
        if(bind(sockfd,(struct sockaddr *)&addr,len) < 0)  
        {  
            perror("bind error");  
            close(sockfd);  
            exit(-1);  
        }  
        printf("Bind is ok\n");  
      
        while(1)  
        {  
            char recv_buf[20] = "";  
            recvfrom(sockfd,recv_buf,sizeof(recv_buf),0,(struct sockaddr*)&addr,&len);  
            printf("Recv: %s\n",recv_buf);  
        }  
        return 0;  
      
    }  

client端:

    #include <stdio.h>  
    #include <string.h>  
    #include <unistd.h>  
    #include <stdlib.h>  
    #include <sys/socket.h>  
    #include <sys/un.h>  
      
    #define PATH "./tt"  
      
    int main(int argc,char *argv[])  
    {  
        int sockfd = 0;  
        struct sockaddr_un addr;  
        bzero(&addr,sizeof(addr));  
      
        addr.sun_family = AF_UNIX;  
        strcpy(addr.sun_path,PATH);  
      
        sockfd = socket(AF_UNIX,SOCK_DGRAM,0);  
        if(sockfd < 0)  
        {  
            perror("socket error");  
            exit(-1);  
        }  
      
        while(1)  
        {  
            static int counter = 0;  
            char send_buf[20] = "";  
            counter++;  
            sprintf(send_buf,"Counter is %d",counter);  
            int len = strlen(addr.sun_path)+sizeof(addr.sun_family);  
            sendto(sockfd,send_buf,strlen(send_buf),0,(struct sockaddr*)&addr,len);  
            printf("Send: %s\n",send_buf);  
            sleep(1);  
        }  
        return 0;  
    }  

tcp  server                        tcp client

        socket                        socket

         unlink

          bind

           listen

           accept                     connect

           write                        read

            close                        close

            unlink

udp server                             udp client

        socket                               socket

         bind

          recvfrom                       sendto

         close                               close

猜你喜欢

转载自blog.csdn.net/chenpuo/article/details/80532218