广播式的socket编程(服务器端和客户端)

2408阅读 0评论2008-06-13 LinuxSmartphone
分类:LINUX

#include
#include
#include
#include
#include
#include

#include
#include

#define GSMD_UNIX_SOCKET_TYPE    SOCK_STREAM

#define GSMD_UNIX_SOCKET "\0gsmd"

服务器端:
int usock_init(struct gsmd *g)
{
    struct sockaddr_un sun;
    int fd, rc;

    __ucmd_ctx = talloc_named_const(gsmd_tallocs, 1, "ucmd");
    __gu_ctx = talloc_named_const(gsmd_tallocs, 1, "gsmd_user");

    fd = socket(PF_UNIX, GSMD_UNIX_SOCKET_TYPE, 0);
    if (fd < 0)
        return fd;
   
    memset(&sun, 0, sizeof(sun));
    sun.sun_family = AF_UNIX;
    memcpy(sun.sun_path, GSMD_UNIX_SOCKET, sizeof(GSMD_UNIX_SOCKET));

    rc = bind(fd, (struct sockaddr *)&sun, sizeof(sun));
    if (rc < 0) {
        close(fd);
        return rc;
    }

    rc = listen(fd, 10);
    if (rc < 0) {
        close(fd);
        return rc;
    }

    g->gfd_sock.fd = fd;
    g->gfd_sock.when = GSMD_FD_READ | GSMD_FD_EXCEPT;
    g->gfd_sock.data = g;
    g->gfd_sock.cb = &gsmd_usock_cb;

    return gsmd_register_fd(&g->gfd_sock);
}

客户端:
static int lgsm_open_backend(struct lgsm_handle *lh, const char *device)
{
    int rc;

    if (!strcmp(device, LGSMD_DEVICE_GSMD)) {
        struct sockaddr_un sun;
       
        /* use unix domain socket to gsm daemon */
        lh->fd = socket(PF_UNIX, GSMD_UNIX_SOCKET_TYPE, 0);
        if (lh->fd < 0)
            return lh->fd;
       
        memset(&sun, 0, sizeof(sun));
        sun.sun_family = AF_UNIX;
        memcpy(sun.sun_path, GSMD_UNIX_SOCKET, sizeof(GSMD_UNIX_SOCKET));

        rc = connect(lh->fd, (struct sockaddr *)&sun, sizeof(sun));
        if (rc < 0) {
            close(lh->fd);
            lh->fd = -1;
            return rc;
        }
    } else    
        return -EINVAL;

    return 0;
}
这里客户端通过GSMD_UNIX_SOCKET的路径和服务器端匹配,只要是这个路径,服务器端发出的 数据,连接好的客户端都能收到,即广播式的
上一篇:添加一句柄fd到g_mainloop()的循环监听,也就是添加到gtk_main()监听
下一篇:在开发板上增加中文环境