曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 22185|回复: 0
打印 上一主题 下一主题

本地通信实例(AF_UNIX)

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2010-4-1 23:16:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序说明
程序里包含服务端和客户端两个程序,它们之间使用 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 < 5; i++, 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 < 5; i++, 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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 00:03 , Processed in 0.092509 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表