zoukankan      html  css  js  c++  java
  • socket 在Unix domain的使用

    server.c

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <unistd.h>
    #include <sys/un.h>
    #include <pthread.h>
    #include <sys/syscall.h>
    
    #define UNIX_DOMAIN "/tmp/test"
    
    
    void *threaddeal(void *arg)
    {
      printf("this is a new thread
    ");  
      int  com_fd = *(int*)arg;
       char recv_buf[1024];
       memset(recv_buf,0,1024);
       char snd_buf[1024];
       memset(snd_buf,0,1024);
       strcpy(snd_buf,"server to client");
       int  num;
      while(num=read(com_fd,recv_buf,sizeof(recv_buf)))
      {
          printf("server recv  (%d)) :%s, threadid = %u,lwpid = %u
    ",num,recv_buf,pthread_self(),syscall(SYS_gettid));
          memset(recv_buf,0,1024);
          write(com_fd,snd_buf,sizeof(snd_buf));//回复client
      }
          close(com_fd);
    }
    
    int main(void)
    {
        socklen_t clt_addr_len;
        int listen_fd;
        int com_fd;
        int ret;
        struct sockaddr_un clt_addr;
        struct sockaddr_un srv_addr;
        listen_fd=socket(PF_UNIX,SOCK_STREAM,0);
        if(listen_fd<0)
        {
            perror("cannot create communication socket");
            return 1;
        }
    
        //set server addr_param
        srv_addr.sun_family=AF_UNIX;
        strncpy(srv_addr.sun_path,UNIX_DOMAIN,sizeof(srv_addr.sun_path)-1);
        unlink(UNIX_DOMAIN);
        //bind sockfd & addr
        ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
        if(ret==-1)
        {
            perror("cannot bind server socket");
            close(listen_fd);
            unlink(UNIX_DOMAIN);
            return 1;
        }
        //listen sockfd
        ret=listen(listen_fd,1);
        if(ret==-1)
        {
            perror("cannot listen the client connect request");
            close(listen_fd);
            unlink(UNIX_DOMAIN);
            return 1;
        }
        //have connect request use accept
        clt_addr_len=sizeof(clt_addr);
        while(1)
     {
        com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&clt_addr_len);
        if(com_fd<0)
        {
            perror("cannot accept client connect request");
            close(listen_fd);
            unlink(UNIX_DOMAIN);
            return 1;
        }
      //开一个新线程处理新连接com_fd
        pthread_t threadid;   //线程的标识符
         if(pthread_create(&threadid,NULL,threaddeal,(void*)(&com_fd)) != 0)
         {
            perror("cannot creat new thread");
         }
    
    }
        close(listen_fd);
        unlink(UNIX_DOMAIN);
        return 0;
    }

    client.c

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <sys/un.h>
    #include <unistd.h>
    #include <pthread.h>
    
    #define UNIX_DOMAIN "/tmp/test"
    
    
    void *threaddeal(void *arg)
    {
      printf("this is a new thread
    ");  
      int  com_fd = *(int*)arg;
       char recv_buf[1024];
       memset(recv_buf,0,1024);
       char snd_buf[1024];
       memset(snd_buf,0,1024);
      int num;
      while(num=read(com_fd,recv_buf,sizeof(recv_buf)))
      {
          printf("client recv : (%d)) :%s
    ",num,recv_buf);
          memset(recv_buf,0,1024);
      }
          close(com_fd);
    }
    
    int main(void)
    {
        int connect_fd;
        int ret;
        char snd_buf[1024];
        struct sockaddr_un srv_addr;
    //creat unix socket
        connect_fd=socket(PF_UNIX,SOCK_STREAM,0);
        if(connect_fd<0)
        {
            perror("cannot create communication socket");
            return 1;
        }
        srv_addr.sun_family=AF_UNIX;
        strcpy(srv_addr.sun_path,UNIX_DOMAIN);
    //connect server
        ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
        if(ret==-1)
        {
            perror("cannot connect to the server");
            close(connect_fd);
            return 1;
        }
        memset(snd_buf,0,1024);
        strcpy(snd_buf,"client send to server11111111111");
    
      //开新线程处理server返回 pthread_t threadid;
    //线程的标识符 if(pthread_create(&threadid,NULL,threaddeal,(void*)(&connect_fd)) != 0) { perror("cannot creat new thread"); } //send msg to server while(1){ write(connect_fd,snd_buf,sizeof(snd_buf)); sleep(2); } close(connect_fd); return 0; }
  • 相关阅读:
    Java基础语法(11)-面向对象之关键字
    Java基础语法(10)-面向对象之三大特征
    Java基础语法(9)-面向对象之类的成员
    Java基础语法(8)-数组中的常见排序算法
    Java基础语法(7)-数组
    Java基础语法(6)-注释
    Java基础语法(5)-特殊流程控制语句
    Java基础语法(4)-流程控制
    Java基础语法(3)-运算符
    sunset: dawn
  • 原文地址:https://www.cnblogs.com/nanqiang/p/11354089.html
Copyright © 2011-2022 走看看