udp併發服務器程序之客戶端測試----初步修改

#include <pthread.h>
#include <iostream>
#include <errno.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <algorithm>
#include <iterator>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sstream>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>

const int PROCESS_NUMBER=3;
const int THREAD_NUMBER=1000;
pthread_mutex_t mutex;

void* thread_function(void* args)
{  
  std::stringstream buf;
  struct sockaddr_in* server_addr = (sockaddr_in*)args;
  int my_socket = socket(AF_INET, SOCK_DGRAM, 0);
  if (my_socket == -1)
    {
      perror("create socket failure");
      pthread_exit(NULL);
    }
  char data[512];
  bzero(data, sizeof(data));
  snprintf(data, 512, "%ld", random());
  buf<<"send data size is:"<<data<<std::endl;
  if (sendto(my_socket, (void*)&data, sizeof(data), 0,(sockaddr*)server_addr, sizeof(sockaddr_in)) == -1)
    {
      perror("sendto data failure");
      close(my_socket);
      pthread_exit(NULL);
    }
  char buffer[1024];
  struct sockaddr_in receive_addr;
  socklen_t len = sizeof(sockaddr_in);
  buf<<"wait for recvice data:";
  std::size_t actual_len = recvfrom(my_socket, buffer, 1024, 0, (sockaddr*)&receive_addr, &len);
  if (actual_len == -1)
    {
      perror("revcfrom data failure");
    }
  else
    {
      //buf<<std::endl<<pthread_self()<<"receive data:";
      std::copy(buffer, buffer+actual_len, std::ostream_iterator<char>(buf));
      buf<<"/n/n";
    }
  pthread_mutex_lock(&mutex);
  printf("%s", buf.str().c_str());
  pthread_mutex_unlock(&mutex);
  close(my_socket);
}

int main(int argc, char* argv[])
{
  pid_t pid;
  int current_index=0;
  while ((pid=fork())>0 && (++current_index<PROCESS_NUMBER));
 
  //redirect stdout
  char file_name[50];
  bzero(file_name, sizeof(file_name));
  snprintf(file_name, sizeof(file_name), "%ld", getpid());  
  if (dup2(open(file_name, O_APPEND|O_CREAT|O_RDWR, S_IRUSR|S_IWUSR|S_IXUSR), STDOUT_FILENO) == -1)
    {
      perror("dup2 failure");
      return -1;
    }
  std::cout<<getpid()<<" process start"<<std::endl;
  struct sockaddr_in server_addr;
  bzero(&server_addr, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons(1120);
  server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

  srand((unsigned long)time(NULL));
  pthread_t pt[THREAD_NUMBER];
  pthread_attr_t attr;
  if (pthread_attr_init(&attr) != 0)
    {
      perror("pthread attr init failure");
      return -1;
    }

  if (pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN*2) != 0)
    {
      perror("pthread attr set stack failure");
      return -1;
    }
 
  if (pthread_mutex_init(&mutex, NULL) != 0)
    {
      perror("pthread mutex init failuer");
      return -1;
    }

  for (int i=0; i<THREAD_NUMBER; i++)
    {
      if (pthread_create(&pt[i], &attr, &thread_function, (void*)&server_addr) != 0)
    {
      perror("create thread fialure");
      //perror(strcat(file_name,"create thread fialure"));
      break;
    }      
    }
  for (int j=0; j<THREAD_NUMBER; j++)
    {
      pthread_join(pt[j], NULL);      
    }
  pthread_mutex_destroy(&mutex);
  std::cout<<getpid()<<"process exit"<<std::endl;
  return 0;
}

發佈了66 篇原創文章 · 獲贊 0 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章