- 论坛徽章:
- 0
|
#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 GSMD_UNIX_SOCKET, sizeof(GSMD_UNIX_SOCKET));
rc = bind(fd, (struct sockaddr *)&sun, sizeof(sun));
if (rc 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 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 fd);
lh->fd = -1;
return rc;
}
} else
return -EINVAL;
return 0;
}
这里客户端通过GSMD_UNIX_SOCKET的路径和服务器端匹配,只要是这个路径,服务器端发出的 数据,连接好的客户端都能收到,即广播式的
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/66024/showart_995169.html |
|