zoukankan      html  css  js  c++  java
  • linux网络编程--UNIX域套接字

    UNIX域套接字

      socket同样可以用于本地通信

      创建套接字时使用本地协议PF_UNIX(或PF_LOCAL)PF_LOCAL

      分为流式套接字和用户数据报套接字

      和其他进程间通信方式相比使用方便。效率更高

      用于前后台进程通信

    本地地址结构:

     struct sockaddr_un

    {

      sa_family_t sun_family;

      char sun_path[108];

    };

    填充地址结构

       struct sockaddr_un myaddr;

      bzero(&myaddr,sizeof(myaddr));

      myaddr.sun_family=PF_UNIX;

      strcpy(myaddr.sun_path,"mysocket");

    UNIX域流式套接字

    服务器端:

      socket(PF_UNIX,SOCK_STREAM,0);

      bind(本地地址);

      listen()

      aceept()

      recv/send

    客户端

      socket(PF_UNIX,SOCK_STREAM,0);

      bind(本地地址);

      connect();

      recv/send();

    server.c

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/un.h>
    
    #define  err_log(errlog)  do{perror(errlog); exit(1);}while(0)
    #define  N  128
    
    int main(int argc, const char *argv[])
    {
        int sockfd;
        int confd;
        struct sockaddr_un  serveraddr, clientaddr;
        char buf[N] = {};
    
    
        if((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
        {
            err_log("fail to socket");
        }
    
        printf("sockfd = %d
    ", sockfd);
    
        serveraddr.sun_family = AF_UNIX;
        strcpy(serveraddr.sun_path, "mysocket");
    
        if(bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
        {
            err_log("fail to bind");
        }
    
        if(listen(sockfd, 10) < 0)
        {
            err_log("fail to listen");
        }
    
        socklen_t addrlen = sizeof(struct sockaddr);
        if((confd = accept(sockfd, (struct sockaddr *)&clientaddr, &addrlen)) < 0)
        {
            err_log("fail to accept");
        }
        
        while(1)
        {
    
            if(recv(confd, buf, N, 0) < 0)
            {
                err_log("fail to recv");
            }
            printf("From client:%s
    ", buf);
    
            strcpy(buf, " Message from server");
    
            if(send(confd, buf, N, 0) < 0)
            {
                err_log("fail to send");
            }
        }
    
        close(sockfd);
    
        return 0;
    }

    client.c

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/un.h>
    
    #define  err_log(errlog)  do{perror(errlog); exit(1);}while(0)
    #define  N  128
    
    // ./client  192.168.0.196  10000
    
    int main(int argc, const char *argv[])
    {
        int sockfd;
        int confd;
        struct sockaddr_un  serveraddr, clientaddr;
        char buf[N] = {0};
    
        if((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
        {
            err_log("fail to socket");
        }
    
        printf("sockfd = %d
    ", sockfd);
    
        serveraddr.sun_family = AF_UNIX;
        strcpy(serveraddr.sun_path, "mysocket");
    
        if(connect(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
        {
            err_log("fail to connect");
        }
    
        while(1)
        {
            printf("Input >");
            fgets(buf, N, stdin);
            buf[strlen(buf)-1] = '';
    
            send(sockfd, buf, N, 0);
            
        }
    
    
        close(sockfd);
        
    
        return 0;
    }

    其实这个与前面的tcp模型类似

    重点关注UNIX域用户数据报套接字

    UNIX域用户数据报套接字:

    服务器端:

      socket(PF_UNIX,SOCK_DGRAM,0);

      bind(本地地址);

      recvfrom

      sendto

    客户端:

     socket(PF_UNIX,SOCK_DGRAM,0);

      bind(本地地址);

      需要设置两个地址如下:

      serveraddr.sun_family = AF_UNIX;
      strcpy(serveraddr.sun_path, "mysocket");

      clientaddr.sun_family = AF_UNIX;
      strcpy(clientaddr.sun_path, "socket");

      if(bind(sockfd, (struct sockaddr*)&clientaddr, sizeof(clientaddr)) < 0)
      {
      err_log("fail to bind");
      }

      sendto()

      recvfrom();

    实例如下:

    server.c

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/un.h>
    
    #define  err_log(errlog)  do{perror(errlog); exit(1);}while(0)
    #define   N  128
    
    int main(int argc, const char *argv[])
    {
        int sockfd;
        struct sockaddr_un serveraddr;
        struct sockaddr_un clientaddr;
        socklen_t addrlen = sizeof(clientaddr);
        char buf[N] = {};
    
        if((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
        {
            err_log("fail to socket");
        }
    
        serveraddr.sun_family = AF_UNIX;
        strcpy(serveraddr.sun_path, "mysocket");
    
        if(bind(sockfd, (struct sockaddr*)&serveraddr, sizeof(serveraddr)) < 0)
        {
            err_log("fail to bind");
        }
    
    
        while(1)
        {
            if(recvfrom(sockfd, buf, N, 0, (struct sockaddr*)&clientaddr, &addrlen) < 0)
            {
                err_log("fail to recvfrom");
            }
    
            printf("From clientaddr:%s --> %s
    ", buf, clientaddr.sun_path);
            if(strncmp(buf, "quit", 4) == 0)
            {
                break;
            }
    
            strcpy(buf, "Message from server...");
    
            if(sendto(sockfd, buf, N, 0, (struct sockaddr*)&clientaddr, sizeof(clientaddr)) < 0)
            {
                err_log("fail to sendto");
            }
        }
    
        close(sockfd);
    
    
        
        return 0;
    }

    client.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <sys/un.h>
    
    #define  err_log(errlog)  do{perror(errlog); exit(1);}while(0)
    #define   N  128
    
    // ./send 192.168.0.255 10000
    int main(int argc, const char *argv[])
    {
        int sockfd;
        struct sockaddr_un serveraddr;
        struct sockaddr_un clientaddr;
        socklen_t addrlen = sizeof(clientaddr);
        char buf[N] = {};
    
    
        if((sockfd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0)
        {
            err_log("fail to socket");
        }
    
        serveraddr.sun_family = AF_UNIX;
        strcpy(serveraddr.sun_path, "mysocket");
    
        clientaddr.sun_family = AF_UNIX;
        strcpy(clientaddr.sun_path, "socket");
    
        if(bind(sockfd, (struct sockaddr*)&clientaddr, sizeof(clientaddr)) < 0)
        {
            err_log("fail to bind");
        }
    
        while(1)
        {
            printf("Input > ");
            fgets(buf, N, stdin);
            buf[strlen(buf)-1] = '';
    
            if(sendto(sockfd, buf, N, 0, (struct sockaddr *)&serveraddr, addrlen) < 0)
            {
                err_log("fail to sendto");
            }
    
            if(strncmp(buf, "quit", 4) == 0)
            {
                break;
            }
    
            if(recvfrom(sockfd, buf, N, 0, (struct sockaddr *)&serveraddr, &addrlen) < 0)
            {
                err_log("fail to recvfrom");
            }
    
            printf("%s
    ", buf);
    
        }
    
        close(sockfd);
    
        return 0;
    }
    View Code
  • 相关阅读:
    开始学习编写用于 Windows SideShow 设备的小工具【转】
    Windows Mobile 6.5 Developer Tool Kit 下载
    Microsoft Security Essentials 微软免费杀毒软件下载
    SQL Server 2008 空间数据存储摘抄(SRID 点 MultiPoint LineString MultiLineString 多边形 MultiPolygon GeometryCollection)
    Vista Sidebar Gadget (侧边栏小工具)开发教程 (2)
    Vista Sidebar Gadget (侧边栏小工具)开发教程 (4)
    负载测试、压力测试和性能测试的异同
    Windows Server 2008 Vista Sidebar Gadget (侧边栏小工具) 入门开发实例
    Silverlight Tools 安装失败 解决办法
    SQL Server 2008 空间数据库 空间索引概念及创建(取自帮助)
  • 原文地址:https://www.cnblogs.com/bwbfight/p/9304450.html
Copyright © 2011-2022 走看看