1. 程式人生 > >C語言 AF_UNIX tcp/udp socket例項

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