Unix域套接字
Unix域套接字是通过套接字API实现的简单的协议族。实际上它并不代表一个网络协议;它只能连接到同一台机器上的套接字。它提供了灵活的IPC机制。它的地址是它所在的文件系统的路径名,创建之后套接字就和路径名绑定在一起。用来表示Unix域地址的套接字文件能够使用stat()但是不能通过open()打开,而且应该使用套接字API对它进行操作。
Unix域套接字是面向连接的,每个套接字的连接都建立了一个新的通讯信道。服务器可能同时处理许多连接,但对于每个连接都有不同的文件描述符。这个属性使Unix域套接字能够比命名管道更好的适应IPC任务。
.
在一个终端运行服务器,然后在另一个终端(在相同目录下)运行客户端。当从客户端输入一行时,数据将通过套接字送到服务器。当退出客户端,服务器将 等待另外一个连接。还可以通过客户端程序的重定向输入来传送文件,cat uclient.c | ./uclient ./uclient < uclient.c
服务器程序userver.c
/* userver.c - Simple Unix Domain Socket server */
/* Waits for a connection on the ./sample-socket Unix domain
  socket. Once a connection has been established, copy data
  from the socket to stdout until the other end closes the
  connection, and then wait for another connection to the
  socket. */
#include <stdio.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include "sockutil.h"          /* some utility functions */
int main(void) {
    struct sockaddr_un address;
    int sock, conn;
    size_t addrLength;
    if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
        die("socket");
    /* Remove any preexisting socket (or other file) */
    unlink("./sample-socket");
    address.sun_family = AF_UNIX;      /* Unix domain socket */
    strcpy(address.sun_path, "./sample-socket");
    /* The total length of the address includes the sun_family
      element */
    addrLength = sizeof(address.sun_family) +
                strlen(address.sun_path);
    if (bind(sock, (struct sockaddr *) &address, addrLength))重定向过多是什么意思
        die("bind");
    if (listen(sock, 5))
        die("listen");
    while ((conn = accept(sock, (struct sockaddr *) &address,
                          &addrLength)) >= 0) {
        printf("---- getting data\n");
        copyData(conn, 1);
        printf("---- done\n");
        close(conn);
    }
    if (conn < 0)
        die("accept");
   
    close(sock);
    return 0;
}
客户端程序uclient.c
/* uclient.c - Simple Unix Domain Socket client */
/* Connect to the ./sample-socket Unix domain socket, copy stdin
  into the socket, and then exit. */
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include "sockutil.h"          /* some utility functions */
int main(void) {
    struct sockaddr_un address;
    int sock;
    size_t addrLength;
    if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
        die("socket");
    address.sun_family = AF_UNIX;    /* Unix domain socket */
    strcpy(address.sun_path, "./sample-socket");
    /* The total length of the address includes the sun_family
      element */
    addrLength = sizeof(address.sun_family) +
                strlen(address.sun_path);
    if (connect(sock, (struct sockaddr *) &address, addrLength))
        die("connect");
    copyData(0, sock);
    close(sock);
   
    return 0;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。