Chinaunix首页 | 论坛 | 博客
  • 博客访问: 180770
  • 博文数量: 63
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 69
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-18 13:11
文章分类
文章存档

2013年(64)

我的朋友

分类: LINUX

2013-05-30 15:56:58

  SOCKET是进程间通信的一种方式,这个时候socket的创建、绑定、连接时的参数是与网络上不同主机间的通信不同的,比如对于socketaddr的使用,进程间通信使用的是sockaddr_un。而主机间的通信使用的是sockadd_in。
  现贴出简单的未使用线程的进程间通信代码:
  server端:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/socket.h>
  5. #include <sys/un.h>
  6. #include <unistd.h>
  7. #define UNIX_DOMAIN "/tmp/UNIX.domain"

  8. int main(void)
  9. {
  10.   int lsn_fd, apt_fd;
  11.   struct sockaddr_un srv_addr;
  12.   struct sockaddr_un clt_addr;
  13.   socklen_t clt_len;
  14.   int ret;
  15.   int i;
  16.   char recv_buf[1024];
  17.   char send_buf[1024];
  18.   
  19.   //create socket to bind local IP and PORT
  20.   lsn_fd = socket(PF_UNIX, SOCK_STREAM, 0);
  21.   if(lsn_fd < 0)
  22.   {
  23.     perror("can't create communication socket!");
  24.     return 1;
  25.   }
  26.   
  27.   //create local IP and PORT
  28.   srv_addr.sun_family = AF_UNIX;
  29.   strncpy(srv_addr.sun_path, UNIX_DOMAIN, sizeof(srv_addr.sun_path) - 1);
  30.   unlink(UNIX_DOMAIN);
  31.   
  32.   //bind sockfd and sockaddr
  33.   ret = bind(lsn_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
  34.   if(ret == -1)
  35.   {
  36.     perror("can't bind local sockaddr!");
  37.     close(lsn_fd);
  38.     unlink(UNIX_DOMAIN);
  39.     return 1;
  40.   }
  41.   
  42.   //listen lsn_fd, try listen 1
  43.   ret = listen(lsn_fd, 1);
  44.   if(ret == -1)
  45.   {
  46.     perror("can't listen client connect request");
  47.     close(lsn_fd);
  48.     unlink(UNIX_DOMAIN);
  49.     return 1;
  50.   }
  51.   
  52.   clt_len = sizeof(clt_addr);
  53.   while(1)
  54.   {
  55.     apt_fd = accept(lsn_fd, (struct sockaddr*)&clt_addr, &clt_len);
  56.     if(apt_fd < 0)
  57.     {
  58.       perror("can't listen client connect request");
  59.       close(lsn_fd);
  60.       unlink(UNIX_DOMAIN);
  61.       return 1;
  62.     }
  63.   
  64.     printf("received a connection\n");
  65.     printf("send message to client\n");
  66.     memset(send_buf, 0, 1024);
  67.     strcpy(send_buf, "Hello, you have connected to server succeed");
  68.     
  69.     int snd_num = write(apt_fd, send_buf, 1024);
  70.     if(snd_num != 1024)
  71.     {
  72.       perror("send messge to client failed\n");
  73.       close(apt_fd);
  74.       close(lsn_fd);
  75.       unlink(UNIX_DOMAIN);
  76.       return 1;
  77.     }
  78.     //read and printf client info
  79.     printf("============info=================\n");
  80.     for(i = 0; i < 4; i++)
  81.     {
  82.       memset(recv_buf, 0, 1024);
  83.       int rcv_num = read(apt_fd, recv_buf, sizeof(recv_buf));
  84.       printf("Message from client (%d) :%s\n", rcv_num, recv_buf);
  85.     }
  86.   }
  87.   close(apt_fd);
  88.   close(lsn_fd);
  89.   unlink(UNIX_DOMAIN);
  90.   return 0;
  91. }
client端:

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/socket.h>
  4. #include <sys/un.h>
  5. #include <unistd.h>
  6. #define UNIX_DOMAIN "/tmp/UNIX.domain"

  7. int main(void)
  8. {
  9.   int connect_fd;
  10.   struct sockaddr_un srv_addr;
  11.   char snd_buf[1024];
  12.   char rcv_buf[1024];
  13.   int ret;
  14.   int i;
  15.   
  16.   //create client socket
  17.   connect_fd = socket(PF_UNIX, SOCK_STREAM, 0);
  18.   if(connect_fd < 0)
  19.   {
  20.     perror("client create socket failed");
  21.     return 1;
  22.   }
  23.   
  24.   //set server sockaddr_un
  25.   srv_addr.sun_family = AF_UNIX;
  26.   strcpy(srv_addr.sun_path, UNIX_DOMAIN);
  27.   
  28.   //connect to server
  29.   ret = connect(connect_fd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
  30.   if(ret == -1)
  31.   {
  32.     perror("connect to server failed!");
  33.     close(connect_fd);
  34.     unlink(UNIX_DOMAIN);
  35.     return 1;
  36.   }
  37.   
  38.   //receive message from server
  39.   memset(rcv_buf, 0, 1024);
  40.   int rcv_num = read(connect_fd, rcv_buf, sizeof(rcv_buf));
  41.   printf("receive message from server (%d) :%s\n", rcv_num, rcv_buf);
  42.   //printf("\n");
  43.   
  44.   //send message to server
  45.   memset(snd_buf, 0, 1024);
  46.   strcpy(snd_buf, "message from client");
  47.   printf("sizeof(snd_buf): %d\n", sizeof(snd_buf));
  48.   sleep(2000);
  49.   
  50.   //send message to server
  51.   for(i = 0; i < 4; i++)
  52.   {
  53.     write(connect_fd, snd_buf, sizeof(snd_buf));
  54.   }
  55.   close(connect_fd);
  56.   return 0;
  57. }

批注:如果想要实现多个客户端的登录,可以书写一个shell脚本,进行批处理连接。
阅读(1481) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~