client.C
上传用户:shtangtang
上传日期:2007-01-04
资源大小:167k
文件大小:2k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #define __THREADS_MAIN
  2. #include <thread.h>
  3. extern "C" {
  4. #include <stddef.h>
  5. #include <stdlib.h>
  6. #include <stdio.h>
  7. #include <unistd.h>
  8. #include <errno.h>
  9. #include <fcntl.h>
  10. #include <sys/mman.h>
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <sys/file.h>
  14. #include <sys/socket.h>
  15. #include <sys/un.h>
  16. #include <sys/time.h>
  17. };
  18. char share[90];
  19. struct sockaddr_un sock;
  20. int sock_id;
  21. size_t size;
  22. int local_socket(const char *fname)
  23. {
  24.   if ( (sock_id = socket(PF_LOCAL,SOCK_DGRAM,0)) < 0 )
  25.     return -1;
  26.   sock.sun_family = AF_LOCAL;
  27.   strncpy(sock.sun_path,fname,sizeof(sock.sun_path));
  28.   size = SUN_LEN(&sock);
  29.   if ( bind(sock_id,(struct sockaddr *)&sock,size) < 0 )
  30.     return -1;
  31.   return sock_id;
  32. }
  33. int local_recv(const char *msg, int max)
  34. {
  35.   struct sockaddr_un named_sock;
  36.   size_t size = sizeof(struct sockaddr_un);
  37.   int nbytes;
  38.   nbytes = recvfrom(sock_id,(void *)msg,max,0,(struct sockaddr *)&named_sock,&size);
  39.   cout << "read " << nbytes << " bytes.n";
  40.   return nbytes;
  41. }
  42. int local_send(const char *msg)
  43. {
  44.   int nbytes;
  45.   nbytes = sendto(sock_id,msg,strlen(msg)+1,0,(struct sockaddr *)&sock,size);
  46.   cout << "sent " << nbytes << " bytes.n";
  47.   return nbytes;
  48. }
  49. int local_input(int seconds)
  50. {
  51.   fd_set set;
  52.   struct timeval timeout;
  53.   FD_ZERO(&set);
  54.   FD_SET(sock_id,&set);
  55.   timeout.tv_sec = seconds;
  56.   timeout.tv_usec = 0;
  57.   return select(FD_SETSIZE,&set,NULL,NULL,&timeout);
  58. }
  59. class server : public pthread {
  60.  private:
  61.   char *buf;
  62.  public:
  63.   server()
  64.     {
  65.       buf = new char[80];
  66.       unlink("/tmp/client");
  67.       cout << "open socketn";
  68.       if ( local_socket("/tmp/client") == -1 )
  69. exit(-1);
  70.       cout << "restartn";
  71.       restart();
  72.     }
  73.   ~server() { };
  74.   int thread(void *x)
  75.     {
  76.       suspend();
  77.       cout << "server active" << endl;
  78.       while( true ) {
  79. cout << "loop" << endl;
  80. if ( local_input(2) == 1 ) {
  81.   if ( local_recv(buf,80) > 0 )
  82.     cout << "server: " << buf << endl;
  83. }
  84.       }
  85.     }
  86. };
  87. int main(int argc, char **argv)
  88. {
  89.   server *serv;
  90.   if ( argc == 1 ) {
  91.     serv = new server;
  92.     for(int i=1;i<5;i++) {
  93.       local_send("lock me momma, lock me good...");
  94.       sleep(1);
  95.     }
  96.     cout << "join result #" << serv->join() << endl;
  97.   } else {
  98.     unlink("/tmp/client");
  99.     local_socket("/tmp/client");
  100.     for(int i=1;i<5;i++) {
  101.       local_send("rock a bye, baby...");
  102.       sleep(1);
  103.     }
  104.   }
  105. }