udp并发服务器程序之客户端测试----再次修改

  1. #include <pthread.h>
  2. #include <iostream>
  3. #include <errno.h>
  4. #include <sys/socket.h>
  5. #include <sys/types.h>
  6. #include <time.h>
  7. #include <algorithm>
  8. #include <iterator>
  9. #include <netinet/in.h>
  10. #include <arpa/inet.h>
  11. #include <sstream>
  12. #include <fcntl.h>
  13. #include <unistd.h>
  14. #include <sys/stat.h>
  15. const int PROCESS_NUMBER=4;
  16. const int THREAD_NUMBER=100;
  17. pthread_mutex_t mutex;
  18. int thread_index=THREAD_NUMBER;
  19. void* thread_function(void* args)
  20. {  
  21.   std::stringstream buf;
  22.   struct sockaddr_in* server_addr = (sockaddr_in*)args;
  23.   int my_socket = socket(AF_INET, SOCK_DGRAM, 0);
  24.   if (my_socket == -1)
  25.     {
  26.       perror("create socket failure");
  27.       pthread_exit(NULL);
  28.     }
  29.   char data[512];
  30.   bzero(data, sizeof(data));
  31.   snprintf(data, 512, "%ld", random());
  32.   buf<<"send data size is:"<<data<<std::endl;
  33.   if (sendto(my_socket, (void*)&data, sizeof(data), 0,(sockaddr*)server_addr, sizeof(sockaddr_in)) == -1)
  34.     {
  35.       perror("sendto data failure");
  36.       close(my_socket);
  37.       pthread_exit(NULL);
  38.     }
  39.   char buffer[1024];
  40.   struct sockaddr_in receive_addr;
  41.   socklen_t len = sizeof(sockaddr_in);
  42.   buf<<"recvice data:";
  43.   std::size_t actual_len = recvfrom(my_socket, buffer, 1024, 0, (sockaddr*)&receive_addr, &len);
  44.   if (actual_len == -1)
  45.     {
  46.       perror("revcfrom data failure");
  47.     }
  48.   else
  49.     {
  50.       //buf<<std::endl<<pthread_self()<<"receive data:";
  51.       std::copy(buffer, buffer+actual_len, std::ostream_iterator<char>(buf));      
  52.     }
  53.   pthread_mutex_lock(&mutex);
  54.   thread_index--;
  55.   buf<<"/n"<<thread_index<<"thread exit/n/n";
  56.   printf("%s", buf.str().c_str());
  57.   pthread_mutex_unlock(&mutex);
  58.   close(my_socket);
  59. }
  60. int main(int argc, char* argv[])
  61. {
  62.   pid_t pid;
  63.   int current_index=0;
  64.   while ((++current_index<PROCESS_NUMBER) && ((pid=fork())>0));
  65.   /*
  66.   //redirect stdout
  67.   char file_name[50];
  68.   bzero(file_name, sizeof(file_name));
  69.   snprintf(file_name, sizeof(file_name), "%ld", getpid());
  70.   int old_std_out = dup(STDOUT_FILENO);  
  71.   if (dup2(open(file_name, O_APPEND|O_CREAT|O_RDWR, S_IRUSR|S_IWUSR|S_IXUSR), STDOUT_FILENO) == -1)
  72.     {
  73.       perror("dup2 failure");
  74.       return -1;
  75.     }
  76.   */
  77.   std::cout<<getpid()<<" process start"<<std::endl;
  78.   struct sockaddr_in server_addr;
  79.   bzero(&server_addr, sizeof(server_addr));
  80.   server_addr.sin_family = AF_INET;
  81.   server_addr.sin_port = htons(1120);
  82.   server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
  83.   srand((unsigned long)time(NULL));
  84.   pthread_t pt[THREAD_NUMBER];
  85.   pthread_attr_t attr;
  86.   if (pthread_attr_init(&attr) != 0)
  87.     {
  88.       perror("pthread attr init failure");
  89.       return -1;
  90.     }
  91.   if (pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN*2) != 0)
  92.     {
  93.       perror("pthread attr set stack failure");
  94.       return -1;
  95.     }
  96.  
  97.   if (pthread_mutex_init(&mutex, NULL) != 0)
  98.     {
  99.       perror("pthread mutex init failuer");
  100.       return -1;
  101.     }
  102.   int i;
  103.   for (i=0; i<THREAD_NUMBER; i++)
  104.     {
  105.       if (pthread_create(&pt[i], &attr, &thread_function, (void*)&server_addr) != 0)
  106.     {
  107.       perror("create thread fialure");      
  108.       break;
  109.     }     
  110.     }
  111.   pthread_mutex_lock(&mutex);
  112.   std::cout<<"create thread number is:"<<i<<std::endl<<"rest thread number:"<<thread_index<<std::endl;
  113.   pthread_mutex_unlock(&mutex);
  114.   for (int j=0; j<THREAD_NUMBER; j++)
  115.     {
  116.       pthread_join(pt[j], NULL);      
  117.     }
  118.   //getchar();
  119.   pthread_mutex_destroy(&mutex);
  120.   //dup2(old_std_out, STDOUT_FILENO);
  121.   std::cout<<getpid()<<"process exit"<<std::endl;
  122.   return 0;
  123. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值