linux 本地通信實例 AF_UNIX close (sockfd)很重要

程序說明
程序裏包含服務端和客戶端兩個程序,它們之間使用 AF_UNIX 實現本機數據流通信。使用 AF_UNIX 域實際上是使用本地 socket 文件來通信。

服務器端代碼
 

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
        int server_sockfd, client_sockfd;
        int server_len, client_len;
        struct sockaddr_un server_address;      /*聲明一個UNIX域套接字結構*/
        struct sockaddr_un client_address;
        int i, bytes;
        char ch_send, ch_recv;
        unlink ("server_socket");       /*刪除原有server_socket對象*/
        /*創建 socket, 通信協議爲AF_UNIX, SCK_STREAM 數據方式*/
        server_sockfd = socket (AF_UNIX, SOCK_STREAM, 0);
        /*配置服務器信息(通信協議)*/
        server_address.sun_family = AF_UNIX;
        /*配置服務器信息(socket 對象)*/
        strcpy (server_address.sun_path, "server_socket");
        /*配置服務器信息(服務器地址長度)*/
        server_len = sizeof (server_address);
        /*綁定 socket 對象*/
        bind (server_sockfd, (struct sockaddr *)&server_address, server_len);
        /*監聽網絡,隊列數爲5*/
        listen (server_sockfd, 5);
        printf ("Server is waiting for client connect...\n");
        client_len = sizeof (client_address);
        /*接受客戶端請求; 第2個參數用來存儲客戶端地址; 第3個參數用來存儲客戶端地址的大小*/
        /*建立(返回)一個到客戶端的文件描述符,用以對客戶端的讀寫操作*/
        client_sockfd = accept (server_sockfd, (struct sockaddr *)&server_address, (socklen_t*)&client_len);
        if (client_sockfd == -1{
                perror ("accept");
                exit (EXIT_FAILURE);
        }
        printf ("The server is waiting for client data...\n");
        for (i = 0, ch_send = '1'i < 5i++, ch_send++{
                if ((bytes = read (client_sockfd, &ch_recv, 1)) == -1{
                        perror ("read");
                        exit (EXIT_FAILURE);
                }
                printf ("The character receiver from client is %c\n", ch_recv);
                sleep (1);
                if ((bytes = write (client_sockfd, &ch_send, 1)) == -1{
                        perror ("read");
                        exit (EXIT_FAILURE);
                }
        }
                close (client_sockfd);
                unlink ("server socket");
}



客戶端代碼
 

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>

int main (int argc, char *argv[])
{
    struct sockaddr_un address;
    int sockfd;
    int len;
    int i, bytes;
    int result;
    char ch_recv, ch_send;

    /*創建socket,AF_UNIX通信協議,SOCK_STREAM數據方式*/
    if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1{
            perror ("socket");
            exit (EXIT_FAILURE);
    }

    address.sun_family = AF_UNIX;
    strcpy (address.sun_path, "server_socket");
    len = sizeof (address);

    /*向服務器發送連接請求*/
    result = connect (sockfd, (struct sockaddr *)&address, len);
    if (result == -1{
        printf ("ensure the server is up\n");
        perror ("connect");
        exit (EXIT_FAILURE);
    }

    for (i = 0, ch_send = 'A'i < 5i++, ch_send++{
        if ((bytes = write(sockfd, &ch_send, 1)) == -1{ /*發消息給服務器*/
            perror ("write");
            exit (EXIT_FAILURE);
        }

        sleep (2);    /*休息二秒鐘再發一次*/

        if ((bytes = read (sockfd, &ch_recv, 1)) == -1{ /*接收消息*/
            perror ("read");
            exit (EXIT_FAILURE);
        }

        printf ("receive from server data is %c\n", ch_recv);
    }
    close (sockfd);

    return (0);
}



程序說明
先運行服務器端,然後再運行客戶端可以在兩邊同時看到輸出。服務器端先運行後會出現如下提示:
 

 ./sock_local_server 
Server is waiting for client connect...


這表示,服務器端已經被阻塞到到 accept() 這裏,服務器就在此等候客戶端的連接。
如果不是先運行服務器端,而直接運行客戶端,那麼客戶端會提示:
 

 ./sock_local_client 
ensure the server is up
connect: Connection refused


提示服務器沒有準備好,連接被拒絕,從而直接退出程序。

如果服務器和客戶端依次運行,可以在兩邊看到輸出:
服務器端
 

 ./sock_local_server 
Server is waiting for client connect...
The server is waiting for client data...
The character receiver from client is A
The character receiver from client is B
The character receiver from client is C
The character receiver from client is D
The character receiver from client is E


客戶端
 

./sock_local_client 
receive from server data is 1
receive from server data is 2
receive from server data is 3
receive from server data is 4
receive from server data is 5

QQ 240136495

http://www.jsqj.cc 軍事新聞 愛好者。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章