- #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=4;
- const int THREAD_NUMBER=100;
- pthread_mutex_t mutex;
- int thread_index=THREAD_NUMBER;
- 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<<"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));
- }
- pthread_mutex_lock(&mutex);
- thread_index--;
- buf<<"/n"<<thread_index<<"thread exit/n/n";
- 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 ((++current_index<PROCESS_NUMBER) && ((pid=fork())>0));
- /*
- //redirect stdout
- char file_name[50];
- bzero(file_name, sizeof(file_name));
- snprintf(file_name, sizeof(file_name), "%ld", getpid());
- int old_std_out = dup(STDOUT_FILENO);
- 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;
- }
- int i;
- for (i=0; i<THREAD_NUMBER; i++)
- {
- if (pthread_create(&pt[i], &attr, &thread_function, (void*)&server_addr) != 0)
- {
- perror("create thread fialure");
- break;
- }
- }
- pthread_mutex_lock(&mutex);
- std::cout<<"create thread number is:"<<i<<std::endl<<"rest thread number:"<<thread_index<<std::endl;
- pthread_mutex_unlock(&mutex);
- for (int j=0; j<THREAD_NUMBER; j++)
- {
- pthread_join(pt[j], NULL);
- }
- //getchar();
- pthread_mutex_destroy(&mutex);
- //dup2(old_std_out, STDOUT_FILENO);
- std::cout<<getpid()<<"process exit"<<std::endl;
- return 0;
- }